Code

[도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지] 2. 아키텍처 개요

noahkim_ 2025. 6. 18. 17:38

최범균 님의 "도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지" 책을 정리한 포스팅 입니다.

 

1. 네 개의 영역

  • 표현 영역, 애플리케이션 영역, 도메인 영역, 인프라스트럭처 영역

 

2. 계층 구조 아키텍처

단방향 의존성

  • 상위가 하위 의존 (하위는 상위 의존 안함)
  • ➡️ 도메인, 비즈니스 영역이 인프라스트럭처에 의존함

 

문제점

  • ❌ 테스트 어려움
  •  기능 확장 어려움

 

3. DIP (Dependency Inversion Principle)

  • 저수준 모듈이 고수준 모듈에 의존하도록 바꿈
  • 컴파일 시점에 해당 고수준 모듈 타입(인터페이스)에 의존함

 

DIP와 아키텍처

  • 애플리케이션 영역과 도메인 영역에 영향을 최소화하면서 구현체를 변경하거나 추가할 수 있음
항목 도메인 서비스 애플리케이션 서비스
책임 여러 도메인에 걸친 순수한 도메인 규칙 구현 유스케이스 조합 및 흐름 제어
위치 도메인 계층 애플리케이션 계층
상태 보유 여부 Stateless Stateless
외부 시스템 접근
트랜잭션 처리
예시 “A 계좌에서 B 계좌로 이체 가능 여부” “이체 요청을 받아 트랜잭션으로 이체 수행”

 

주의사항

  • ✅ 고수준 모듈 관점에서 하위 기능을 추상화한 인터페이스를 도출해야 함
  • (단순히 인터페이스와 구현 클래스를 분리하는 정도가 아님)

 

4. 도메인 영역의 주요 구성요소

Aggregate

  • 연관된 Entity와 Value Object를 개념적으로 하나로 묶은 단위
  • ✅ 연관된 객체들을 하나의 트랜잭션 단위로 관리
  • ex) 주문 - 주문 정보, 주문 상품들
  • ex) 게시글 - 게시글, 댓글들
  • ex) 회원 - 회원, 주소 정보

 

root entity
  • Aggregate 내부 객체들을 대표해서 관리하는 엔티티
항목 설명 특징
역할 애그리거트의 진입점 역할 내부 구성요소의 행위 위임 (하위 엔티티/밸류)
접근 제한 외부에서는 Root만 직접 접근 가능 나머지 객체는 Root를 통해 간접 접근
책임 애그리거트 전체의 일관성과 캡슐화 보장 도메인 규칙 준수 (유효성 체크 등)

 

Repository

  • 도메인 모델의 영속성 처리
  • ✅ 애그리거트 단위로 도메인 객체를 저장하고 조회하는 기능 담당

 

Domain Service

  • 특정 엔티티에 넣기 애매한 비즈니스 규칙을 다루는 서비스 객체
  • ✅ 여러 엔티티와 밸류를 필요로 할 경우 도메인 서비스에서 로직을 구현함

 

예) 주문 - 배송비 계산

더보기
public class ShippingFeeCalculator {
    public Money calculateShippingFee(Order order, Customer customer) {
        if (customer.isVip()) {
            return Money.ZERO;
        } else {
            return order.getTotalPrice().isGreaterThan(new Money(50000))
                ? Money.ZERO
                : new Money(3000);
        }
    }
}
  • 주문, 고객, 정책 등 여러 도메인 객체를 받아서 비즈니스 로직을 수행

 

5. 요청 처리 흐름

6. 인프라스트럭처 개요

7. 모듈 구성

  • 영역별로 패키지 구성하기

 

구조) 도메인 별 패키지 구성

더보기
com.example.project
 ├── order
 │    ├── ui
 │    ├── application
 │    ├── domain
 │    └── infra
 └── product
      ├── ui
      ├── application
      ├── domain
      └── infra