소프트웨어 아키텍처

도메인 주도 설계 입문

meellon 2026. 6. 29. 05:20

학습 목표

도메인 주도 설계(DDD)복잡한 비즈니스에서 경계·언어·모델을 맞추는 접근임을 설명할 수 있다.

Bounded Context모델·용어·책임의 경계임을 설명할 수 있다.

Ubiquitous Language개발·도메인 공통 언어를 만드는 방법임을 설명할 수 있다.

Context Map으로 컨텍스트 간 관계를 그리고 통합 전략을 고를 수 있다.

문제 상황

  • Customer entity 하나 — 마케팅·주문·배송·정산이 같은 테이블 공유
    • 마케팅 필드 추가 → 배송 batch 깨짐
  • 회의에서 "Product" — 기획은 진열, 개발은 SKU, 창고는 박스 단위
    • 같은 단어, 다른 의미 — 요구사항 오해
  • MSA로 쪼갰는데 공유 DB + 공유 DTO — distributed monolith
  • order 모듈이 payment entity import — bounded context 없음
  • Context Map 없이 integration — 누가 upstream인지 몰라 API 역전

결합도·응집·by feature까지 봤다. DDD는 그 경계를 어디에 두는지 언어로 고정하는 방법이다.

1. DDD 한눈에

도메인 주도 설계(Eric Evans) — 소프트웨어 구조·언어비즈니스 도메인에 맞춘다.

핵심 개념 한 줄
Domain 소프트웨어가 풀려는 문제 영역 (주문, 결제, 배송…)
Model 도메인 이해를 코드·다이어그램으로 표현
Bounded Context 일관된 모델·용어가 유효한 경계
Ubiquitous Language 팀·도메인 전문가 공통 용어
Context Map 컨텍스트 간 관계·통합 지도
  • DDD = 전술(tactic) + 전략(strategy) — 이번 편은 전략 입문 (경계·지도)
  • Evans — 큰 모델 하나보다 작은 모델 여러 개 + 명시적 관계

2. Bounded Context

Within a boundary, a model is consistent.

Bounded Context(BC) — 특정 유비쿼터스 언어도메인 모델내부에서 일관되게 통하는 경계.

같은 단어, 다른 모델

컨텍스트 "Product" 의미 핵심 속성
Catalog 진열·검색 대상 title, category, image
Sales 판매 SKU price, stock reservation
Shipping 포장·운송 단위 weight, dimensions
  • 하나의 Product 테이블에 전부 넣으면 — 모든 팀한 aggregate에 coupling
  • BC마다 자기 모델 — Sales의 Product와 Shipping의 Product다른 타입 (ID로만 연결)

BC와 아키텍처

BC 코드·배포 대응
모놀리스 패키지·모듈 경계 (sales/, shipping/)
MSA 서비스 후보 (DB per context)
Conway — BC ≈ ownership 단위
  • Shared kernel 최소화 — 진짜 공통(value object)만
  • Anti-corruption layer(ACL) — 외부 모델이 내 모델을 오염시키지 않게 변환

3. Ubiquitous Language

Use the language of the domain everywhere.

유비쿼터스 언어 — 개발자·기획·운영·도메인 전문가가 같은 단어같은 의미를 쓰게 한다.

나쁜 예 좋은 예 (Sales BC)
OrderDTO, saveRecord Order, placeOrder
status = 3 OrderStatus.SHIPPED
기술 회의만 영어/약어 코드·테스트·회의 동일 용어
// Sales bounded context — terms match workshop language
public final class Order {
    private final OrderId id;
    private OrderStatus status;

    void ship(ShipmentReference ref) {
        if (status != OrderStatus.PAID) {
            throw new IllegalStateException("cannot ship unpaid order");
        }
        status = OrderStatus.SHIPPED;
        // domain event OrderShipped ...
    }
}
  • Glossary 문서 — BC 에서만 유효한 정의
  • 번역 레이어 — integration DTO와 domain 분리 (ACL)

4. Context Map

Context Map — BC들 사이 관계를 그림·표로 명시한다.

관계 (Evans) 의미
Partnership 두 BC 동시 변경 협력 Sales ↔ Promotion
Customer-Supplier Upstream이 downstream 요구 반영 Sales → Billing
Conformist Downstream이 upstream 모델 그대로 외부 PG conform
Anticorruption Layer Upstream 모델 번역 후 사용 레거시 ERP → Sales
Open Host Service 공개 프로토콜 (REST, 이벤트) Catalog API
Published Language OHS의 표준 포맷 ProductListed event
Catalog --[published language]--> Sales
Sales --[customer-supplier]--> Billing
Sales --[customer-supplier]--> Shipping
Legacy ERP --[ACL]--> Sales
  • Upstream — 변경 주도권; downstream은 적응
  • Map 없으면 암묵적 conformist — 레거시 DTO가 전역 standard가 됨
  • code/context-map-example.md — 관계 표 예시

5. Part 3와 연결

이전 편 DDD
by feature BC ≈ feature 경계
결합도 BC port·event, 공유 DB 지양
MSA 분해 capability + BC
EDA BC integration — 이벤트 + published language
헥사고날 BC 포트·어댑터
  • DDD는 모놀리스에서도 BC 패키지로 시작 — MSA는 증거 있을 때

6. 실무 팁

단계 행동
1 이벤트 스토밍·워크샵 — 동사·명사 후보 수집
2 Glossary — BC별 용어 정의
3 Context Map 초안 — upstream/downstream
4 코드 — package by BC, integration ACL
5 재검토 — 분기마다 map·경계 갱신
함정 대응
BC = 팀 수만큼 쪼개기 모델 경계 기준
Anemic + DDD 용어만 행동 있는 domain model
Map 문서만 ArchUnit·모듈 의존으로 검증
전역 God entity BC별 translation

7. 정리

  • Bounded Context — 일관된 모델·언어의 경계; 같은 단어 다른 모델 OK
  • Ubiquitous Language — 코드·회의·문서 동일 용어
  • Context Map — BC 관계·통합 전략 (CS, ACL, OHS…)
  • 모놀리스·MSA·팀 경계와 정렬하는 전략 DDD
  • Part 3 마무리 — Part 4부터 분산 아키텍처

다음에 다룰 것

  • 분산 시스템 기초
  • Scale up/down, load balancing, stateless vs stateful

해당 내용은 Domain-Driven Design (Eric Evans) 및 Fundamentals of Software Architecture (Mark Richards, Neal Ford) 의 내용을 기반으로 합니다.

'소프트웨어 아키텍처' 카테고리의 다른 글

CAP과 일관성 모델  (0) 2026.07.01
분산 시스템 기초  (0) 2026.06.30
결합도와 응집도  (0) 2026.06.28
SOLID 원칙  (0) 2026.06.27
아키텍처 스타일 비교와 선택  (0) 2026.06.26