본문 바로가기

DDD/도메인 주도 설계 철저 입문

DDD 프로젝트 폴더 구조 - 「도메인 주도 설계 철저 입문」 11장 (1)

 

 

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 도메인별 폴더구조 한 도메인에 대한 코드가 한 패키지에 모여있음 도메인간 참조는 패키지간 참조이며, 일반적이지 않음