Skip to content
메모장
Go back

DDD 전술적 설계 2(Tactical Design)

전술적 설계 핵심 요약

Entity          → ID로 구분하고, 상태 변화 가능하며, 비즈니스 로직을 캡슐화한다
Value Object    → 값으로 구분하고, 불변이며, 자가 검증한다
Aggregate       → 일관성 경계를 형성하고, Root를 통해 접근하며, 작게 유지한다
Domain Event    → 과거 사실을 나타내고, 느슨한 결합을 이루며, 통합에 활용한다
Repository      → Aggregate 단위로 영속성을 추상화한다
Domain Service  → 여러 객체에 걸친 무상태 도메인 로직을 다룬다
Factory         → 복잡한 객체 생성을 캡슐화한다
App Service     → 유스케이스를 조율한다.(도메인 지식이 없다)

도메인 로직은 도메인 객체 안에! Application Service는 조율만!

전술적 설계 태스크 (전략적 설계 완료 후)

전략적 설계(Bounded Context, Context Map, Ubiquitous Language)가 완료된 상태에서
전술적 설계를 진행하는 순서와 각 태스크를 정리.

전체 흐름

[설계 확인]
    └─ 전략적 설계 산출물 검토
           │
           ▼
[도메인 모델 설계]  ← 코드 작성 전, 팀 합의 단계
    ├─ Entity / Value Object 분류
    ├─ Aggregate 경계 설계
    └─ 불변식(Invariant) 정의
           │
           ▼
[도메인 계층 구현]  ← 인프라 의존 없는 순수 도메인 코드
    ├─ Value Object 구현  (Entity보다 먼저)
    ├─ Aggregate / Entity 구현
    ├─ Domain Event 구현
    ├─ Domain Service 구현
    ├─ Factory 구현
    └─ Repository 인터페이스 정의
           │
           ▼
[검증 → 외부 연결]
    ├─ 도메인 단위 테스트
    ├─ Application Service 구현
    ├─ Repository 구현체 (인프라)
    ├─ Domain Event 핸들러 구현
    └─ 통합 테스트 및 최종 검증

Task 1. 전략적 설계 산출물 검토 및 전술 설계 준비

완료된 전략적 설계 결과물(Bounded Context 목록, Context Map, Ubiquitous Language 사전)을 검토하고, 전술적 설계를 시작할 BC 우선순위를 결정해야 한다. 각 BC별 핵심 도메인 개념 목록 초안을 작성해야 한다.

체크리스트


Task 2. BC별 Entity / Value Object 식별 및 분류

Ubiquitous Language 사전을 기반으로 각 BC 내 개념을 Entity와 Value Object로 분류해야 한다.

판단 기준: “식별자(ID)가 필요한가?” → Entity / 값 자체로 구분되는가? → Value Object

개념식별자 필요?분류이유
Order✅Entity주문 이력 추적 필요
Customer✅Entity개별 고객 관리 필요
Product✅Entity상품 정보 변경 추적
Money❌Value Object금액+통화 값으로 충분
Address❌Value Object주소 자체가 의미 단위
Quantity❌Value Object수량 값으로 충분

체크리스트


Task 3. Aggregate 경계 설계 및 Aggregate Root 지정

Entity들을 묶어 일관성 경계(Aggregate)를 설계하고 각 Aggregate의 Root를 지정해야 한다.

설계 원칙

체크리스트


Task 4. Aggregate별 불변식(Invariant) 정의

각 Aggregate가 항상 보장해야 하는 비즈니스 규칙을 도출해야 한다.
불변식은 이후 Entity 메서드 내부의 guard 조건으로 직접 구현된다.

예시

Order Aggregate
  - 주문 확정 시 아이템이 1개 이상이어야 한다
  - 확정된 주문은 수정할 수 없다
  - 취소된 주문은 재확정할 수 없다

Product Aggregate
  - 재고가 0 미만이 될 수 없다
  - 판매 중지 상품은 주문에 추가할 수 없다

체크리스트


Task 5. Value Object 구현

분류된 Value Object를 코드로 구현해야 한다. Entity 구현 전에 먼저 완성해야 한다.

구현 요건

체크리스트


Task 6. Aggregate 및 Entity 구현

Aggregate Root 및 내부 Entity를 구현해야 한다.

구현 요건

체크리스트


Task 7. Domain Event 도출 및 구현

각 Aggregate의 주요 상태 변화에서 Domain Event를 도출하고 구현해야 한다.

네이밍 규칙: 과거형 동사 + 명사를 사용한다 (OrderConfirmed, PaymentCompleted)

예시 이벤트 목록

OrderPlaced      → 재고 감소, 결제 요청
OrderConfirmed   → 배송 준비 시작
OrderCancelled   → 재고 복구, 환불 처리
PaymentCompleted → 주문 상태 변경

체크리스트


Task 8. Domain Service 식별 및 구현

특정 Entity/Value Object에 자연스럽게 속하지 않는 도메인 로직을 Domain Service로 분리해야 한다.

판단 기준

“이 로직이 특정 객체의 책임인가?”
YES → Entity/VO의 메서드 / NO → Domain Service

체크리스트


Task 9. Factory 구현

복잡한 Aggregate 생성 로직을 Factory로 캡슐화해야 한다.

방식사용 시기
companion object factory간단한 생성, 외부 의존 없음
별도 Factory 클래스외부 의존성 필요 (Repository 등)
Factory Method생성 책임이 다른 도메인 개념에 있을 때

체크리스트


Task 10. Repository 인터페이스 정의 (도메인 계층)

Aggregate Root마다 Repository 인터페이스를 도메인 계층에 정의해야 한다.

원칙

체크리스트


Task 11. 도메인 계층 단위 테스트 작성

인프라 없이 순수 도메인 로직만 테스트해야 한다.

테스트 대상

체크리스트


Task 12. Application Service 구현

유스케이스 단위로 Application Service를 작성해야 한다.

역할

체크리스트


Task 13. Repository 구현체 및 영속성 매핑 작성 (인프라 계층)

실제 저장소(JPA/MongoDB 등) 구현체와 도메인 ↔ 영속성 모델 매핑을 작성해야 한다.

체크리스트


Task 14. Domain Event 핸들러 구현 및 BC 간 통합

이벤트별 핸들러를 구현하고 BC 간 통합 방식을 결정해야 한다.

통합 방식 선택 기준 (Context Map 기반)

체크리스트


Task 15. 통합 테스트 및 전술 설계 검증

Application Service → Domain → Repository → DB 전체 흐름을 통합 테스트하고, 전술 설계가 전략적 설계 산출물을 올바르게 반영하는지 최종 검증해야 한다.

체크리스트


Share this post:

Previous Post
DDD 전술적 설계 팁
Next Post
DDD 전술적 설계 1(Tactical Design)