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

개념식별자 필요?분류이유
OrderEntity주문 이력 추적 필요
CustomerEntity개별 고객 관리 필요
ProductEntity상품 정보 변경 추적
MoneyValue Object금액+통화 값으로 충분
AddressValue Object주소 자체가 의미 단위
QuantityValue 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)