DDD와 3-Layered의 프로젝트 폴더 구조 비교
3-Layered 프로젝트의 폴더 구조는 대개 위와 같다. 3-Layer에 해당하는 뷰(Controller), 모델(Model), 비즈니스로직(Service)로 폴더가 크게 나뉘어 있다.
# 3-Layered 구조
src/
├── controller/
│ ├── UserController.java
│ └── OrderController.java
│
├── service/
│ ├── UserService.java
│ └── OrderService.java
│
├── repository/
│ ├── UserRepository.java
│ └── OrderRepository.java
│
├── model/
│ ├── User.java
│ └── Order.java
│
└── config/
├── DatabaseConfig.java
└── WebConfig.java
반면 DDD 프로젝트의 폴더 구조는 도메인(Domain), 어플리케이션(Application), 인프라(Infrastructure), 뷰(Presentation)으로 크게 나뉜다.
# ddd 구조 (1) - 레이어별 분리
src/
├── domain/
│ ├── user/
│ │ ├── User.java
│ │ ├── UserRepository.java
│ │ └── UserService.java
│ ├── order/
│ │ ├── Order.java
│ │ ├── OrderRepository.java
│ │ └── OrderService.java
│ └── common/
│ └── ValueObjects.java
│
├── application/
│ ├── UserApplicationService.java
│ └── OrderApplicationService.java
│
├── infrastructure/
│ ├── repository/
│ │ ├── JpaUserRepository.java
│ │ └── JpaOrderRepository.java
│ ├── config/
│ │ ├── DatabaseConfig.java
│ │ └── WebConfig.java
│ └── external/
│ ├── PaymentGateway.java
│ └── EmailService.java
│
├── presentation/
│ ├── UserController.java
│ └── OrderController.java
└── shared/
├── exception/
│ ├── UserNotFoundException.java
│ └── OrderNotFoundException.java
└── utils/
└── DateUtils.java
도메인별 DDD 구조
ddd 구조 (1)과 같이 소스코드의 역할별로 먼저 나눌 수도 있지만, 아래와 같이 도메인별로 폴더링을 먼저 할 수도 있다. 깃헙 프로젝트 참고(🔗).
# ddd 구조(2) - 도메인별 분리
src/
├── user/
│ ├── domain/
│ │ ├── User.java
│ │ ├── UserId.java
│ │ └── UserName.java
│ ├── application/
│ │ ├── common
│ │ ├── create
│ │ ├── delete
│ │ ├── get
│ │ ├── update
│ │ └── UserApplicationService.java
│ ├── infrastructure/
│ │ ├── InMemoryUserRepository.java
│ │ ├── JPAUserRepository.java
│ │ └── IUserRepository.java
│ └── presentation/
│ └── UserController.java
│
├── circle/
│ ├── domain/
│ │ ├── Circle.java
│ │ ├── CircleId.java
│ │ └── CircleName.java
│ ├── application/
│ │ ├── common
│ │ ├── create
│ │ ├── delete
│ │ ├── get
│ │ ├── update
│ │ └── CirlceApplicationService.java
│ ├── infrastructure/
│ │ ├── InMemoryCircleRepository.java
│ │ └── ICircleRepository.java
│ └── presentation/
│ └── CircleController.java
│
└── shared/
├── exception/
│ ├── UserNotFoundException.java
│ └── OrderNotFoundException.java
└── utils/
│ └── DateUtils.java
├── config/
│ ├── DatabaseConfig.java
│ └── WebConfig.java
└── external/
├── PaymentGateway.java
└── EmailService.java
도메인별 vs 레이어별 폴더링 장단점
장점 | 단점 | |
DDD 레이어별 폴더구조 | 앱의 레이어가 폴더구조에 드러나기 때문에 아키텍처를 유지하며 유지보수 하는데 유리함 |
한 도메인에 대한 코드가 여기저기 흩어져 있음 |
DDD 도메인별 폴더구조 | 한 도메인에 대한 코드가 한 패키지에 모여있음 | 도메인간 참조는 패키지간 참조이며, 일반적이지 않음 |
'DDD > 도메인 주도 설계 철저 입문' 카테고리의 다른 글
엔티티 중복 확인은 도메인 서비스인가 앱 서비스인가 - 「도메인 주도 설계 철저 입문」 11장 (3) (2) | 2024.12.10 |
---|---|
Entity Factory 패턴 - 「도메인 주도 설계 철저 입문」 11장 (2) (1) | 2024.11.22 |
데이터의 무결성 유지하기 - 「도메인 주도 설계 철저 입문」 10장 (0) | 2024.10.21 |
팩토리 패턴 - 「도메인 주도 설계 철저 입문」 9장 (0) | 2024.10.13 |
소프트웨어 구현 - 「도메인 주도 설계 철저 입문」 8장 (3) | 2024.10.13 |