Strategic Design(전략적 설계)

Strategic Design (전략적 설계) 는 Eric Evans 가 제시한 Domain-Driven Design (도메인 주도 설계) 의 고수준 설계 접근법이다.
복잡한 비즈니스 도메인을 명확히 구분된 Bounded Context (경계 컨텍스트) 들로 분해하고, 각 컨텍스트 내에서 Ubiquitous Language (공통 언어) 를 구축하며, Context Map (컨텍스트 맵) 을 통해 컨텍스트 간 관계를 정의하여 대규모 소프트웨어 시스템의 복잡성을 체계적으로 관리한다.
이 그림 위에서 Tactical Design(전술 설계) 은 각 바운디드 콘텍스트 내에서 엔티티, VO, 어그리게이트, 리포지토리, 도메인 서비스, 도메인 이벤트 등의 빌딩 블록을 사용하여 도메인 로직을 구현하고 테스트, CI/CD 와 연계하여 구현 완성도를 높인다.

핵심 개념

Strategic Design은 복잡한 도메인을 분해하고, 하위 도메인 간의 관계를 명확하게 정의하여 **조직 구조, 소프트웨어 구조, 팀 협업 구조 간의 정렬 (alignment)**을 도출하는 고수준 설계 접근 방식이다.

주요 개념

Domain & Subdomain
항목설명
Domain소프트웨어가 해결하고자 하는 비즈니스 문제 영역
Subdomain도메인을 기능적으로 세분화한 논리적 단위
Bounded Context (BC)

핵심 포인트:

Ubiquitous Language
Context Map
주요 Context Mapping Patterns
패턴설명
Shared Kernel일부 모델을 공유 (두 팀 간 강한 협력 요구)
Customer/Supplier공급자 팀이 인터페이스를 제공하고, 고객 팀은 그에 의존
Conformist고객 팀이 공급자의 모델에 종속됨
Anticorruption Layer (ACL)외부 BC 로부터 내부 모델을 보호하는 번역 계층
Open Host Service공개 API 로 BC 간 통신
Published Language공통 언어와 형식을 정의하여 통합

실무 구현 요소

분석 및 설계 기법
기법설명
Event Storming도메인 이벤트 기반으로 도메인 흐름 시각화
Domain Storytelling도메인 전문가와 함께 스토리 기반 분석
Bounded Context CanvasBC 설계를 위한 템플릿 기반 도구
조직적 대응
아키텍처 연계

정리

graph TD
  Domain[Domain]
  Domain --> Core[Core Domain]
  Domain --> Supporting[Supporting Domain]
  Domain --> Generic[Generic Domain]

  Core --> BC1[Bounded Context A]
  Supporting --> BC2[Bounded Context B]
  Generic --> BC3[Bounded Context C]

  BC1 --> UL1[Ubiquitous Language]
  BC2 --> UL2[Ubiquitous Language]
  BC3 --> UL3[Ubiquitous Language]

  BC1 --> CM[Context Map]
  BC2 --> CM
  BC3 --> CM

  CM --> SK[Shared Kernel]
  CM --> ACL[Anticorruption Layer]
  CM --> CS[Customer/Supplier]
  CM --> CON[Conformist]

목적 및 필요성

주요 기능 및 역할

  1. 도메인 분석 기능

    • Problem Space 분석: 비즈니스 문제 영역을 체계적으로 분석
    • Subdomain 식별: 도메인을 Core, Supporting, Generic 으로 분류
    • 우선순위 결정: 비즈니스 가치에 따른 투자 우선순위 설정
  2. 모델 설계 기능

    • Bounded Context 정의: 명확한 모델 경계 설정
    • Ubiquitous Language 구축: 팀 전체가 공유하는 도메인 언어 개발
    • Domain Model 설계: 각 컨텍스트별 최적화된 도메인 모델 구성
  3. 통합 관리 기능

    • Context Mapping: 컨텍스트 간 관계와 통합 방식 정의
    • Integration Pattern 선택: 상황에 적합한 통합 패턴 적용
    • 의존성 관리: 컨텍스트 간 의존성을 명시적으로 관리

특징

  1. 고수준 접근법

    • Big Picture 관점: 전체 시스템을 조감하는 거시적 시각
    • 비즈니스 중심: 기술보다 비즈니스 가치를 우선시
    • 전략적 사고: 장기적 관점에서의 시스템 설계
  2. 협업 중심

    • 다학제적 접근: 도메인 전문가, 개발자, 아키텍트의 협업
    • 지속적 학습: 도메인 지식의 지속적 발견과 정제
    • 공통 언어: 모든 이해관계자가 공유하는 의사소통 도구
  3. 경계 중심 설계

    • 명시적 경계: 모델의 적용 범위를 명확히 정의
    • 컨텍스트 독립성: 각 컨텍스트의 자율성 보장
    • 관계 명시: 컨텍스트 간 관계를 명시적으로 정의

핵심 원칙

  1. 모델 무결성 원칙

    • 각 Bounded Context 내에서는 단일하고 일관된 모델 유지
    • 모델의 개념적 무결성을 해치는 요소들 제거
  2. 경계 명시 원칙

    • 모델이 적용되는 범위를 명확히 정의
    • 경계를 넘나드는 개념들에 대한 명시적 변환 정의
  3. 공통 언어 원칙

    • 팀 전체가 공유하는 Ubiquitous Language 구축
    • 코드, 문서, 대화에서 일관된 언어 사용
  4. 비즈니스 가치 중심 원칙

    • Core Domain 에 최대 투자 집중
    • 비즈니스 우선순위에 따른 자원 배분
  5. 팀 자율성 원칙

    • 각 팀이 자신의 컨텍스트 내에서 독립적으로 작업
    • 팀 간 의존성 최소화

주요 원리

flowchart TD
  Problem-Space[문제 공간] --> Subdomain
  Subdomain --> BoundedContext
  BoundedContext --> UbiquitousLanguage
  BoundedContext --> ContextMap
  ContextMap --> IntegrationPatterns
  IntegrationPatterns --> Implementation

분해 원리 (Decomposition Principle)

개념:

실무 포인트:

graph TD
    A[Large Domain] --> B[Core Subdomain]
    A --> C[Supporting Subdomain]
    A --> D[Generic Subdomain]
    B --> E[Bounded Context 1]
    C --> F[Bounded Context 2]
    D --> G[Bounded Context 3]

통합 원리 (Integration Principle)

개념:

실무 포인트:

주요 패턴:

패턴설명
Partnership상호 대등한 관계로 모델 공유와 협력
Customer-Supplier공급자 (Upstream) 는 독립적, 소비자 (Downstream) 는 종속적
Conformist소비자가 공급자의 모델을 강제로 따름
Open Host Service공식 API 를 통해 통합
Separate Ways통합하지 않고 완전히 분리 운영
graph LR
    A[Upstream Context] -->|Partnership| B[Downstream Context]
    C[Supplier Context] -->|Customer-Supplier| D[Consumer Context]
    E[Host Context] -->|Open Host Service| F[Client Context]
    G[Context A] -.->|Separate Ways| H[Context B]

언어 통일 원리 (Ubiquitous Language Principle)

개념:

실무 포인트:

1
2
3
4
Domain Expert ↔ Ubiquitous Language ↔ Developer
      ↕                ↕                 ↕
   Business        Code Model        Software
   Process                          Implementation

전략적 정렬 원리 (Strategic Alignment Principle)

개념:

실무 포인트:

예시 정렬 모델:

graph TD
    OrgA["Team A (Core Domain)"] --> BCA[Bounded Context A]
    OrgB["Team B (Supporting Domain)"] --> BCB[Bounded Context B]
    OrgC["Team C (Generic Domain)"] --> BCC[Bounded Context C]

경계 진화 원리 (Evolution of Boundaries Principle)

개념:

실무 포인트:

작동 원리

도메인 발견 과정

sequenceDiagram
    participant DE as Domain Expert
    participant A as Architect
    participant D as Developer
    
    DE->>A: 비즈니스 프로세스 설명
    A->>D: 도메인 모델 초안 작성
    D->>DE: 모델 검증 요청
    DE->>A: 피드백 제공
    A->>D: 모델 정제
    Note over DE,D: 반복적 정제 과정

Bounded Context 식별 과정

  1. 언어 경계 식별: 용어의 의미가 변하는 지점 찾기
  2. 팀 경계 고려: 조직 구조와 의사소통 패턴 분석
  3. 기술 경계 평가: 기술적 제약사항과 요구사항 고려
  4. 비즈니스 기능 분석: 응집도가 높은 기능 그룹 식별

Context Mapping 과정

  1. 컨텍스트 식별: 모든 Bounded Context 나열
  2. 관계 분석: 컨텍스트 간 의존성과 상호작용 분석
  3. 패턴 선택: 각 관계에 적합한 통합 패턴 선택
  4. 맵 작성: 시각적 컨텍스트 맵 작성

구조 및 아키텍처

graph TB
    subgraph "Problem Space"
        PS[Problem Space]
        CD[Core Domain]
        SD[Supporting Domain]
        GD[Generic Domain]
        PS --> CD
        PS --> SD
        PS --> GD
    end
    
    subgraph "Solution Space"
        SS[Solution Space]
        BC1[Bounded Context 1]
        BC2[Bounded Context 2]
        BC3[Bounded Context 3]
        SS --> BC1
        SS --> BC2
        SS --> BC3
    end
    
    subgraph "Language Layer"
        UL[Ubiquitous Language]
        UL --> BC1
        UL --> BC2
        UL --> BC3
    end
    
    subgraph "Integration Layer"
        CM[Context Map]
        CM --> BC1
        CM --> BC2
        CM --> BC3
    end
구분구성요소기능역할특징
필수Problem Space (문제 공간)비즈니스 문제 영역 정의해결해야 할 비즈니스 도메인 식별현실 세계의 비즈니스 요구사항 반영
Solution Space (해결 공간)소프트웨어 구조 정의Bounded Context 집합 구성기술 제약과 비즈니스 요구의 균형
Bounded Context (경계 컨텍스트)도메인 모델 적용 경계 정의모델 무결성 보장, 팀 자율성 제공명시적 경계 내 일관된 모델 유지
Ubiquitous Language (공통 언어)팀 전체 공유 도메인 언어의사소통 효율, 모델 정확성 향상코드와 회의에서 동일한 용어 사용
선택Context Map (컨텍스트 맵)컨텍스트 간 관계 시각화시스템 전체 구조 이해 및 통합 전략 설계조직 구조와 기술 구조의 일치성 제공
Domain Events (도메인 이벤트)중요한 사건 모델링컨텍스트 간 비동기 통신 구현이벤트 기반 아키텍처 지원
Anti-Corruption Layer (손상 방지 계층)외부 시스템으로부터 모델 보호레거시 시스템과 안전한 통합외부 변화로부터 내부 모델 분리

Problem Space (문제 공간)

정의:

주요 목적

핵심 질문:

실무 적용 포인트:

항목내용
도메인 분해비즈니스 흐름 기반으로 서브도메인을 식별
우선순위 분석Core 도메인에 자원 집중, Generic 도메인은 외부 도입 고려
전략 정렬비즈니스 전략과 소프트웨어 전략의 연계성 확보

추가 분석:

Subdomain

Subdomain 은 전체 도메인 안에서 특정한 목적이나 역할을 수행하는 하위 영역이며, 비즈니스 로직이 명확하게 구분될 수 있는 의미 단위의 경계이다.

필요성:

항목설명
복잡도 분리하나의 도메인이 너무 커지면 이해, 관리, 구현이 어려움 → 하위 도메인으로 나눠서 책임 분리
설계 전략 구분각 Subdomain 마다 기술/설계/아키텍처 접근 방식이 달라질 수 있음
팀 구조 연계팀 간 경계, 업무 영역을 분리하여 병렬적 개발이 가능해짐
Bounded Context 연결Bounded Context 는 보통 하나의 Subdomain 을 구현하는 데 대응됨

Subdomain 분류

유형설명역할실무 고려사항특징
Core Domain비즈니스 가치의 핵심 제공 영역경쟁력 확보, 우선 순위 설계 대상집중 투자, 고급 인력 배치복잡성 높음, 커스터마이징 필요
Supporting DomainCore Domain 을 보조하는 기능비즈니스 흐름 지원외주화 가능, 재사용률 높음유사 사례 많음
Generic Domain범용 기능 제공 영역시스템 전반에서 공통 활용외부 솔루션 도입 가능커스터마이징 필요 없음
graph TD
    A[비즈니스 도메인] --> B[하위 도메인 분리]
    B --> C1[핵심 하위 도메인]
    B --> C2[지원 하위 도메인]
    B --> C3[일반 하위 도메인]
    C1 --> D1[Bounded Context]
    C2 --> D2[Bounded Context]
    C3 --> D3[Bounded Context]
    D1 --> E[Context Map]
    D2 --> E
    D3 --> E

도메인 → 하위 도메인 → Bounded Context → Context Map 흐름

예시: 온라인 교육 플랫폼 (LMS)

Subdomain 유형Subdomain 예시설명
Core학습 콘텐츠 설계, 진도 추적, 시험 로직학습자에게 가장 중요한 가치를 제공하는 핵심 영역
Supporting사용자 프로필 관리, 질문/답변 게시판핵심은 아니지만 플랫폼 경험을 향상시키는 기능
Generic인증/인가, 로깅, 이메일 알림모든 시스템에 공통 적용 가능, 비즈니스 독자성 없음

Subdomain vs. Bounded Context

항목SubdomainBounded Context
정의비즈니스 로직 관점의 하위 도메인설계 및 구현 관점에서 경계를 정의한 영역
관점비즈니스 전략 중심시스템 구현/모델링 중심
하나의 Subdomain 은 여러 개의 Bounded Context 가질 수 있음하나의 Bounded Context 는 보통 하나의 Subdomain 과 연결
관계전략적 설계의 단위전술적 설계와 구현의 단위

Subdomain 은 " 무엇을 해야 하는지 " 를 설명하고, **Bounded Context 는 " 어떻게 구현할 것인지 " 를 결정하는 경계이다. **

Solution Space (해결 공간)

정의:

주요 목적:

핵심 구성 요소:

실무 적용 포인트:

항목내용
아키텍처 적합성도메인 특성에 따라 MSA, 모놀리식 등 설계 방식 결정
팀 구성 정렬각 Bounded Context 를 독립된 팀이 담당
배포 전략BC 단위로 독립적 배포/운영 구조 확보

구성 요소:

세부 구성요소설명역할실무 고려사항특징
Bounded Context 1~3특정 도메인 모델의 적용 범위기술 아키텍처, 팀 구조 정의독립 배포 가능성, 경계 명확성 필수소유된 모델과 언어 존재
Context Boundaries각 컨텍스트 간 명시적 경계종속성, 통신 방식 정의API, 메시지 등 인터페이스 설계 필요느슨한 결합 유지
Context Integration다수 컨텍스트 통합 메커니즘전체 시스템 일관성 유지이벤트, API, ACL 등 선택조직 간 협업 요소

추가 분석:

Bounded Context

정의:

주요 목적:

특징:

구성 요소:

세부 구성요소설명역할실무 고려사항특징
Domain Model해당 컨텍스트에서 사용하는 모델Ubiquitous Language 의 구현체엔터티, VO, Aggregate 설계 필요독립적 진화 가능
Team Ownership해당 컨텍스트를 책임지는 조직책임 분리 및 팀 역량 집중도메인과 조직 일치 필요Conway’s Law 기반 정렬
Autonomous Deployment자체 배포 단위로 설계DevOps 및 배포 독립성 확보CI/CD, 모듈 경계 최적화Microservice 적용 용이

Bounded Context 경계 식별 방법:

경계 식별 기준:

기준설명
언어/의미 차이같은 단어라도 의미가 다른 경우 (예: “Order” → 고객 주문 vs. 재고 발주)
조직/책임 주체 차이담당 조직 또는 팀이 다르면 BC 도 달라야 함
변화 속도/빈도 차이자주 바뀌는 부분과 안정적인 부분은 분리 필요
독립 배포 여부독립적으로 배포 가능한 단위는 별도 BC 로 취급

실무 적용 포인트:

항목내용
책임 분리BC 단위로 코드와 팀의 책임을 명확히 분리
독립 배포BC 를 독립적인 마이크로서비스로 구현 가능
내부 설계Tactical DDD (Entity, VO, Aggregate 등) 적용

실무 적용 확장:

적용 영역세부 설명
데이터베이스각 Bounded Context 는 자신만의 DB 를 소유해야 함. DB 공유는 BC 의미 훼손
배포독립적 CI/CD 파이프라인, 버전 관리 체계를 가져야 함
도메인 언어 관리각 BC 별로 Ubiquitous Language 문서를 관리해야 하며, 타 BC 와의 상호작용 용어도 명시
테스트컨텍스트 별로 계약 기반 테스트 (Contract Testing) 을 통해 통합 안정성 확보 필요
경계의 유연성실제 운영 중에는 BC 경계를 주기적으로 재검토하고, 조직 변화나 도메인 진화에 따라 조정되어야 함

Bounded Context 와 Microservice 의 차이

추가 분석:

Ubiquitous Language

정의:

주요 목적:

목적설명
정확한 커뮤니케이션개발자와 도메인 전문가 간의 의사소통 정확도 향상
도메인 지식 내재화소프트웨어 내부에 비즈니스 규칙과 용어가 반영됨
모델 정합성 유지코드, 테스트, 문서 전반에 걸쳐 일관된 도메인 모델을 사용
학습 곡선 감소도메인 용어에 기반한 명확한 이해 공유로 온보딩 시간 단축
변화 대응성 향상도메인의 변화가 모델과 언어에 반영되어 시스템 적응성 향상

핵심 질문:

실무 적용 포인트:

항목설명
모델 기반 용어 정제도메인 이벤트, 엔터티, 명세 등을 중심으로 명확한 개념 정의
코드에 언어 반영메서드명, 클래스명, 패키지명 등에 도메인 용어 직접 사용
도메인 전문가 참여 유도설계/모델링 시 비개발자의 언어가 존중되고 반영되어야 함
워크숍 도구 활용Event Storming, Domain Storytelling 등으로 언어 정렬 가능
용어 사전 작성 및 유지Bounded Context 단위로 관리되는 도메인 용어집 구축 필요
테스트에도 동일 언어 적용BDD(Behavior Driven Development) 에서 시나리오 기반 테스트 작성 (Given, When, Then)

구성 요소:

구성 요소설명
도메인 용어 집합개념, 상태, 역할, 이벤트, 규칙 등 도메인에 특화된 언어
언어의 일관성하나의 개념은 하나의 용어로만 표현되어야 함
경계 컨텍스트별 구분Ubiquitous Language 는 Bounded Context 에 종속됨 (즉, BC 마다 다를 수 있음)
코드와 모델의 정합성코드 구조와 도메인 모델 간의 이름과 구조가 일치
대화 기반 도출언어는 도메인 전문가와 개발자 간의 지속적인 피드백을 통해 진화

Context Map (컨텍스트 맵)

정의:

주요 목적:

실무 적용 포인트:

항목내용
경계 명확화각 팀과 시스템 사이의 경계 시각화
통합 전략 설계이벤트 vs API 기반, 동기 vs 비동기
조직 연계팀 간 계약 및 커뮤니케이션 프로토콜 정의

구성 요소:

세부 구성요소설명역할실무 고려사항특징
Integration Pattern컨텍스트 간 통합 방식 정의통신 및 의존성 패턴 설계패턴: Shared Kernel, ACL 등아키텍처 유연성 확보
Context Relationships컨텍스트 간 협력/의존 정의Upstream/Downstream 관계 명시팀 간 커뮤니케이션 방식 영향조직 구조 반영
Boundary ContractsAPI 또는 이벤트 형식의 명세명확한 경계 정의Interface 문서화, Test 필요계약 기반 통신 구조

추가 분석:

Upstream, Downstream 그리고 Midway

Context Mapping에서 매우 중요한 개념으로, 두 컨텍스트 간 통신/통합 구조를 설계할 때 어떤 쪽이 주도권을 가지는지, 어떤 쪽이 종속되는지, 혹은 대등한 관계인지를 명확히 하기 위해 사용된다.

구분정의 / 의미주요 역할관계 방향성
Upstream다른 컨텍스트 (Downstream) 에서 사용하는 서비스, API, 이벤트를 제공하는 공급자모델/인터페이스 설계 주도자→ Downstream 에 영향
DownstreamUpstream 이 제공하는 기능 또는 데이터를 소비하는 주체소비자, 통합자, 의존자← Upstream 의 영향 받음
Midway두 컨텍스트가 대등한 협력 관계로 일부 기능/모델을 공동 관리하거나 상호 협의로 연동공동 협업자, 협의 모델 관리자↔ 상호 협력 및 동등 조율

Upstream, Downstream 그리고 Midway 의 관계:

1
2
3
Upstream  →  Downstream
     Midway

실무 적용 포인트:

전략적 시사점:

주요 통합 패턴
구분패턴설명관계 특성장점단점실무 고려사항
UpstreamOpen Host Service (OHS)API 또는 이벤트를 통해 외부에서 접근 가능한 서비스를 공식적으로 제공Upstream 이 명시적 인터페이스 제공유연한 통합, 명확한 계약보안, 버전 관리 필요외부 컨텍스트와 표준화된 프로토콜 유지 필요
Published Language상호 간 통신을 위한 공통된 언어 또는 포맷 제공계약 기반 메시지 교환명확한 메시지 명세, 분산 시스템 적합포맷 진화 어려움JSON, XML, Protobuf 등 표준 사용 권장
MidwayPartnership두 컨텍스트가 동등한 협력자로 상호 의존 관계 형성양방향 커뮤니케이션긴밀한 협력 가능, 공유 목표 유지동시 개발 부담, 커플링 증가조직 간 책임 분배 및 의사소통 명확화 필요
Shared Kernel일부 모델이나 코드 (예: 공통 도메인 객체) 를 공유부분적 모델 공유코드 재사용, 중복 제거변경 시 양쪽 모두 영향공유 범위 최소화, 명확한 계약 필요
Separate Ways각 컨텍스트가 독립적으로 운영되며 통합 없음완전 분리 전략빠른 진화, 독립성 극대화중복 구현, 일관성 상실 위험중복을 감수할 가치가 있는 도메인에 적합
DownstreamCustomer-SupplierDownstream 이 Upstream 의 API 를 소비Upstream 중심 설계빠른 통합, 계약 기반 통신종속성 존재, 구조적 제약API 변경 시 영향 분석 필요
ConformistDownstream 이 Upstream 의 모델과 언어를 그대로 수용일방적 종속 관계빠른 개발, 학습 비용 감소유연성 없음, 변경 전파 영향 큼비핵심 도메인에 적합, 장기적 유지보수 고려
Anti-Corruption Layer (ACL)외부 시스템의 모델을 내부로 직접 들여오지 않고 번역 계층을 둠Upstream 격리내부 모델 보호, 유연한 통합복잡한 중간 계층 필요통합 비용 증가 대비 보호 가치가 있는지 검토
Open Host Service (OHS)
Published Language
Partnership
Shared Kernel
Separate Ways
Customer-Supplier
Conformist
Anti-Corruption Layer (ACL)
요약
패턴활용 사례 / 사용 예시코드 / 구현 방식 요약
Open Host Service (OHS)- 결제, 배송, 인증 등 핵심 서비스 API 공개
- 이벤트 발행을 통한 외부 접근 제공
- REST/gRPC/GraphQL API 제공
- OpenAPI/Swagger 문서화
- 인증/인가 적용, 버전 관리
Published Language- Protobuf/Avro 기반 이벤트 메시지 통신
- 산업 표준 메시지 (EDI, ISO 20022 등) 연동
- 스키마 파일로 메시지 정의 (.proto, .avsc)
- 버전 관리, 타입 안정성 확보
- Schema Registry 활용 가능
Partnership- 대형 금융사 ↔ 핀테크 협업
- 공동 개발 및 양방향 통신
- 정산 로직, 정책 공통 모듈 개발 협업
- 공동 저장소에서 API/명세/계약 관리
- 정기적 협의, 커플링 있음
- Swagger, Pact 계약 테스트 병행 가능
Shared Kernel- 인증 모듈, 도메인 유효성 검사, 예외 공통 처리
- 공통 도메인 모델 (Customer, Product) 공유
- 공통 패키지/모듈 분리
- 도메인 모델 공유 및 영향도 분석
- 변경 시 공동 코드 리뷰 및 계약 관리 필수
Separate Ways- ERP/CRM 시스템 분리 운영
- 병원 진료/예약 컨텍스트 분리
- 데이터/로직 중복 감수
- 모델/시스템/DB 완전 분리
- 동기화 없음, 통합 없음
- 중복 구현 감수하며 각자 진화
Customer–Supplier- 주문 시스템 → 결제 시스템 API 호출
- 사용자 서비스 → 인증 서비스 사용
- 계약 기반 통신 구조
- REST API 기반 요청/응답
- 명세 기반 개발 (OpenAPI)
- SLA 정의, 하위 호환성 유지 전략 필요
Conformist- 외부 OAuth/SSO 연동
- PG 사 결제 응답 포맷 그대로 수용
- 클라이언트 SDK 그대로 사용
- Upstream 모델 구조 그대로 사용
- DTO/Adapter 없이 직접 참조
- API 변경 시 즉시 영향
Anti-Corruption Layer- 레거시 시스템 통합
- 3rd party 시스템 연동
- 의미 매핑 불일치 해결
- Adapter / Translator / Facade 계층 구현
- 외부 모델 → 내부 도메인 변환
- 내부 도메인 보호, 격리 유지

구현 기법

구현 기법정의구성 요소목적실무 예시
Event Storming도메인 이벤트 중심의 협업적 모델링 기법Domain Events, Commands, Aggregates, External Systems도메인 지식 발견, Bounded Context 식별주문 처리 프로세스: 주문 생성됨 → 재고 확인됨 → 결제 처리됨 → 배송 시작됨
Domain Storytelling액터 중심의 스토리 기반 도메인 분석 기법Actors, Work Objects, Activities, Annotations비즈니스 프로세스 시각화 및 이해" 고객이 주문 생성 → 시스템이 재고 확인 " 흐름을 시각적으로 표현
Bounded Context CanvasBounded Context 를 정의하고 문서화하는 구조화 템플릿Name, Purpose, Business Model, Ubiquitous Language경계 컨텍스트의 책임, 인터페이스, 모델 정의" 주문 관리 " 컨텍스트의 모델, 언어, 책임 도출 및 정리
Context Mapping Workshop여러 Bounded Context 간 관계 정의 및 통합 전략 수립을 위한 워크숍Context 식별, 관계 설정, 통합 패턴 선택시스템 전체 구조 정리 및 협력 방식 설정전자상거래 전반의 BC 관계를 Customer-Supplier, ACL 등으로 연결

구현 기법 예시

드론 배송 시스템을 실제 사례로 활용한 DDD 구현 기법 예시

템플릿 유형활용 시점목적
Event Storming초기 도메인 흐름 식별 시이벤트 흐름 기반 컨텍스트 구조 도출
Domain Storytelling도메인 전문가와의 협업 시사용 시나리오 중심으로 명확한 커뮤니케이션
Bounded Context Canvas컨텍스트 설계 및 책임 분리 시컨텍스트 내 책임, 언어, 인터페이스 정리
Context Mapping Workshop전체 시스템 관계 설정 시BC 간 관계 및 통합 방식 명확화
Event Storming: 드론 배송 프로세스
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 📌 Event Storming 워크숍 문서

## 📍 시나리오 제목: 드론 배송 주문 처리

### 🎯 목적
- 드론 배송 도메인 흐름 파악
- Bounded Context 후보 식별

---

### 🟠 Domain Events
| 순번 | 이벤트명             | 트리거 액션               | 설명                                |
|------|----------------------|----------------------------|-------------------------------------|
| 1    | 주문 생성됨          | 고객이 상품을 주문         | 주문 정보가 시스템에 등록됨           |
| 2    | 결제 처리됨          | 주문 완료 시               | PG사 연동을 통한 결제 성공 처리        |
| 3    | 드론 배송 예약됨      | 결제 완료 후               | 드론 배송 일정이 예약됨               |
| 4    | 드론 출발함           | 배송 시간이 도래           | 드론이 창고에서 출발함                 |
| 5    | 배송 완료됨          | 드론이 목적지에 도착        | 고객에게 상품 전달 완료됨              |

---

### 🟢 Commands
| Command 이름      | 발행 주체           | 결과 이벤트           |
|-------------------|----------------------|------------------------|
| PlaceOrder        | 고객                 | 주문 생성됨           |
| ProcessPayment    | 주문 서비스          | 결제 처리됨           |
| ScheduleDelivery  | 배송 스케줄러        | 드론 배송 예약됨       |

---

### 🟣 Aggregates
- `Order`
- `Payment`
- `Delivery`

---

### 🔗 External Systems
- PG사 결제 시스템
- 드론 제어 시스템
Domain Storytelling: 드론 배송 시나리오
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 📌 Domain Storytelling 문서

## 🎯 시나리오: 드론 기반 배송 주문 흐름

---

### 🧑 Actors
- 고객
- 주문 시스템
- 결제 시스템
- 배송 스케줄러
- 드론 운용 시스템

---

### 📖 시퀀스

1. 고객이 앱에서 상품을 주문한다.
2. 주문 시스템이 주문을 생성한다.
3. 주문 시스템이 결제를 요청한다.
4. 결제 시스템이 결제를 승인한다.
5. 배송 스케줄러가 드론 배송을 예약한다.
6. 배송 시간이 도래하면 드론 운용 시스템이 드론을 출발시킨다.
7. 드론이 고객에게 배송을 완료한다.

---

### 📦 Work Objects
- 주문 정보 (Order)
- 결제 요청 (Payment Request)
- 배송 스케줄 (Delivery Schedule)
- 드론 위치 정보 (Drone GPS)
Bounded Context Canvas: 배송 관리 (Delivery Management)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 📘 Bounded Context Canvas

## 🌐 Bounded Context 이름: 배송 관리 (Delivery Management)

---

### 🎯 Purpose
- 드론을 통한 배송 수행 및 상태 관리

---

### 🧭 Business Model
- 배송 요청은 주문 완료 후 생성됨
- 배송 상태는 '예약됨 → 출발함 → 배송 완료됨' 등으로 전이됨
- 드론 ID, 배송 시간, 위치 정보 포함

---

### 🔤 Ubiquitous Language
| 용어         | 정의                                    |
|--------------|-----------------------------------------|
| 배송 예약됨   | 드론이 특정 시간에 출발하도록 지정됨         |
| 드론 출발함   | 실제 배송이 시작됨                        |
| 배송 완료됨   | 고객 위치에 드론이 도착, 상품 전달됨         |

---

### 🔁 External Interfaces
| 시스템명             | 방식     | 설명                        |
|----------------------|----------|-----------------------------|
| 주문 시스템           | REST     | 주문 ID 기반 배송 예약 요청     |
| 드론 운용 시스템       | gRPC     | 드론 이동 명령 및 위치 조회     |
| 모니터링 시스템       | Kafka    | 배송 상태 실시간 스트림 전달    |
Context Mapping Workshop: 전체 드론 배송 시스템
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 🧭 Context Mapping Workshop 결과

## 🧩 참여 Bounded Context 목록

| 이름                | 주요 기능                         | 담당 팀       |
|---------------------|----------------------------------|--------------|
| 주문 관리(Order)     | 상품 주문 생성 및 상태 관리             | 주문팀 김XX   |
| 결제(Payment)       | 결제 요청 및 응답 처리                | 결제팀 이XX   |
| 배송 관리(Delivery)  | 드론 예약 및 배송 상태 관리            | 물류팀 박XX   |
| 드론 운용(Drone Ops) | 드론 이동 제어, 상태 확인              | 운영팀 최XX   |

---

## 🔄 관계 및 통합 패턴

| Source BC      | Target BC         | 관계 유형             | 통합 패턴             |
|----------------|-------------------|------------------------|------------------------|
| 주문 관리        | 결제               | Customer-Supplier       | REST API               |
| 주문 관리        | 배송 관리          | Customer-Supplier       | REST API               |
| 배송 관리        | 드론 운용          | Anti-Corruption Layer   | gRPC + Adapter 패턴     |
| 배송 관리        | 모니터링 시스템     | Upstream Event Publisher| Kafka 메시지 발행       |

---

## 🧠 논의 결과 및 전략
- 드론 운용 시스템은 외부 시스템에 가까우므로 ACL 사용
- 이벤트는 Kafka 기반으로 발행하여 실시간 추적 가능하게 구성

장점

카테고리항목설명관련 개념
아키텍처 및 구조도메인 분리Bounded Context 기반으로 도메인을 명확히 분할Bounded Context
복잡도 관리시스템을 컨텍스트 단위로 나누어 복잡성을 제어Context Map
모델 무결성 유지각 컨텍스트 내 일관된 모델 설계 가능도메인 모델, 언어 정합성
경계 기반 통제명확한 경계로 도메인 간 혼합 방지 및 책임 분리Context Boundary
개발 및 운영 효율독립 배포 및 확장 용이각 컨텍스트는 독립적으로 배포 및 확장 가능Microservice-Friendly
변화 대응력 향상컨텍스트 경계로 변경 범위를 제한하여 유연성 확보Evolutionary Design
기술 선택 유연성각 BC 마다 최적의 기술 스택 선택 가능Polyglot Architecture
유지보수성 향상모듈화로 인해 코드 관리 및 확장 용이도메인 중심 모듈 구성
의존성 최소화도메인 간 강결합 방지로 의존성 관리 가능경계 분리 설계
비즈니스 전략 및 정렬비즈니스 정렬도메인 구조가 비즈니스 전략과 직접 연결됨Core Domain 중심 설계
자원 집중중요 도메인 (Core) 에 우선적으로 역량 및 인력 배치도메인 우선순위
비즈니스 이해도 향상도메인 전문가와 협업을 통해 도메인 지식 내재화Event Storming, Storytelling
변화 영향 최소화외부 시스템 변화에도 내부 모델을 보호 가능Anti-Corruption Layer
팀 및 협업 효율화조직 구조와 아키텍처 정렬팀 경계와 시스템 경계를 일치시켜 책임 명확화Conway’s Law 정렬
팀 자율성 확보컨텍스트 단위로 팀의 독립성과 책임 분리BC 단위 팀 운영
협업 강화도메인별 팀 구성으로 커뮤니케이션 명확화분리된 팀 책임
언어 기반 소통 효율화Ubiquitous Language 로 소통 장애 제거도메인 언어 정합성
UX 및 품질 향상비즈니스 용어의 코드 반영실제 도메인 용어가 코드에 반영되어 이해도 향상모델 ↔ 코드 일치
품질 향상정확한 모델 기반 개발로 오류 가능성 감소정합성 있는 설계 기반
고객 중심 UX 설계 가능도메인 중심 분석이 사용자 여정 기반 설계로 확장Problem Space 기반 설계

단점과 문제점 그리고 해결방안

단점

카테고리항목설명해결책
복잡성/비용초기 설계 및 분석 부담도메인 분석, Bounded Context 식별 등으로 프로젝트 초기 진입 장벽 증가점진적 적용, MVP 기반 설계, 핵심 도메인 우선 도입
높은 초기 투자 비용전략 워크숍, 교육, 도구 도입 등에서 발생하는 시간 및 인력 비용단계적 예산 편성, 장기 ROI 관점 접근
조직/운영도메인 전문가 의존성효과적 설계를 위해 도메인 전문가의 지속적 참여가 필수도메인 전문가 사전 확보, 지식 정제 문서화 체계 구축
조직 구조와 연동 필요성팀 구조와 컨텍스트 설계가 일치하지 않으면 책임 분산 및 소통 장애 발생Conway’s Law 정렬, 컨텍스트별 팀 책임 명확화
학습/문화학습 곡선팀 전체가 DDD 개념, 전략/전술 패턴에 익숙해져야 효과적 설계 가능사내 교육, 워크숍, 이벤트 스토밍, BDD 기반 문서 자동화

문제점

카테고리문제 항목원인영향탐지 및 진단예방 방안해결 방법 및 기법
설계 문제잘못된 경계 설정도메인 이해 부족, 경계 성급한 결정강결합, 모델 오염, 컨텍스트 사이 통신 증가데이터 중복, 컨텍스트 간 API 난립도메인 모델링 강화, Event Storming 반복 적용Context Map 재작성, 경계 재설정
컨텍스트 팽창명확하지 않은 책임 구분, 기능 증가로 경계 확장됨관심사 혼합, 응집도 저하컨텍스트 크기 증가, 다양한 역할 혼재 감지책임 기준 강화, 기능 추가 전 설계 검토컨텍스트 분리, 새로운 BC 정의
Context Drift설계 이후 문서 및 코드 반영 누락, 유지 부실실제 경계와 설계 경계 불일치 → 혼란 및 오류 증가코드 리뷰, 문서 - 구현 불일치 검토정기적인 Context Map 리뷰문서/모델 업데이트, 리팩토링 적용
통합 문제통합 비용 증가ACL, 메시징 등 통합 패턴 남용시스템 복잡도, 성능 저하네트워크 호출 횟수 증가, 트랜잭션 지연 추적통합 우선순위 조정, 경량화 전략 수립캐시 도입, 동기→비동기 전환
과도한 분산마이크로서비스 도입 시 과도한 경계 분할오버헤드 증가, 배포/운영 복잡성호출 트레이싱, 배포 횟수 증가 감지핵심 도메인 중심의 서비스 정의컨텍스트 병합, 모듈화 (Monolith) 전환 고려
협업 문제언어 불일치팀 간 소통 미흡, Ubiquitous Language 관리 부재구현 오류, 명세 불일치코드/문서/회의에서 용어 불일치 감지용어집 관리 도구, 정기 용어 워크숍 운영사전/코드 일치화, 공통 언어 정기 업데이트
유비쿼터스 언어 분절코드/테스트/문서 간 언어 일관성 부족커뮤니케이션 혼란, 요구 누락충돌 단어 탐지, 회의 기록 분석도메인 언어 사전 구축, BDD 기반 테스트 도입Domain Storytelling, 용어 리뷰 주기화

도전 과제

카테고리도전 과제원인영향탐지 및 진단예방 방법해결 방법 및 기법
모듈화 및 독립성경계와 팀 매핑 불일치조직 구조와 도메인 모델 분리개발 병목, 책임 불분명코드 영역 분석, 소유권 추적조직 - 도메인 구조 정렬 검토Bounded Context 재설정, 팀 재정렬
기술적 복잡도경계 해결 정책 부재ACL, 공유 모델 등 통합 전략 미흡통합 실패, 응답 지연실패 로그, API 오류율인터페이스 계약 문서화중계 레이어 도입, 메시지 버전 관리
운영 및 유지관리컨텍스트 간 데이터 흐름 지연비동기 메시징 설계 난이도실시간 연동 실패, 데이터 불일치메시지 대기 시간, DLQ 모니터링오류 리커버리 플로우 설계Retry 정책, Dead Letter Queue 도입
보안 및 규제경계 간 인증/권한 관리 미흡컨텍스트별 인증 정책 부재보안 침해, 개인정보 유출 위험인증 실패 로그, 권한 오남용 기록통합 인증 전략, 최소 권한 원칙OAuth2, API Gateway 권한 제어
분산 시스템 설계분산 시스템 복잡성 증가MSA 도입에 따른 운영 오버헤드네트워크 지연, 부분 실패분산 추적, 장애 분포 로그적절한 경계 크기 유지Circuit Breaker, Saga, Event Sourcing
데이터 일관성데이터 동기화 어려움컨텍스트 간 데이터 분산데이터 불일치, 규칙 위반데이터 품질 지표, 동기 실패 로그Eventually Consistent 설계CQRS, Saga, 보상 트랜잭션 설계
조직 정렬Conway’s Law 미적용팀 구조가 시스템 경계 반영 못함불필요한 의존성, 복잡한 경계팀 간 소통 경로 분석역 Conway 전략 적용조직 개편, 크로스 펑셔널 팀 구성
레거시 통합기존 시스템과 괴리모놀리식 ↔ BC 간 통합 구조 부재기술 부채 누적, 마이그레이션 지연시스템 결합도 분석Strangler Fig 패턴 도입ACL, API Gateway, 인터페이스 분리
협업 및 언어 정합성유비쿼터스 언어 분절팀 간 도메인 언어 불일치커뮤니케이션 오류, 요구 반영 실패용어 충돌 탐지, 회의 기록 분석정기 워크숍, 용어 문서 자동화Domain Storytelling, BDD 테스트 도입

분류 기준에 따른 종류 및 유형

분류 기준유형 / 종류설명주요 특징 / 활용 목적
도메인 중요도Core Domain비즈니스 핵심 가치/경쟁력을 제공하는 영역최고 품질, 고비용 투자, 도메인 전문가 집중
Supporting DomainCore Domain 을 지원하는 도메인중요도 중간, 유연한 설계 가능
Generic Domain범용적, 표준화된 기능 제공 도메인외부 솔루션 대체 가능, 비즈니스 차별성 없음
Bounded Context 관계Partnership두 컨텍스트가 동등한 협력자 관계양방향 협력, 공동 책임, 긴밀한 소통 필요
Customer–Supplier상하류 모델 구조, 공급자 - 소비자 관계API 기반 통합, 의존성 방향 명확
Conformist하위 컨텍스트가 상위 모델을 그대로 수용통합 용이하나 유연성 부족, 하위 도메인의 유연성 제한
Anti-Corruption Layer (ACL)외부 시스템 또는 상위 모델의 변경으로부터 내부 보호번역 계층 도입, 모델 오염 방지
Open Host Service외부와의 통합을 위해 공개된 API 나 인터페이스 제공명확한 계약 기반 통신, 외부 소비자와의 상호작용 지원
Published Language여러 컨텍스트가 공유하는 명세 기반 공통 언어 정의통합 용이, 표준 메시지 포맷 사용
Shared Kernel특정 모델의 일부를 소규모로 공유강한 협력 기반, 변경 시 상호 영향 가능성 존재
Separate Ways각 컨텍스트가 완전히 독립적으로 운영됨의존성 제거, 중복 구현 허용, 유지보수 유리
모델링 기법Event Storming도메인 이벤트 중심의 협업적 모델링 기법빠른 도메인 흐름 파악, Bounded Context 식별
Domain Storytelling액터와 활동 중심의 스토리 기반 도메인 모델링도메인 프로세스 내러티브 표현, 도메인 전문가 중심
Bounded Context CanvasBounded Context 설계의 구조화된 템플릿 도구책임, 인터페이스, 팀, 언어 등을 체계적으로 정의
아키텍처 구현 방식Monolith단일 애플리케이션 구조초기 설계 용이, 경계 혼합 위험 있음
Modular Monolith내부적으로 BC 기준 분할된 모놀리식 구조점진적 전환 가능, MSA 이행 준비 단계
Microservices Architecture각 컨텍스트 단위를 독립 서비스로 구현한 구조독립 배포, 기술 선택 자유도, 조직 - 아키텍처 정렬 필수
통합 및 통신 방식REST / API 기반 통신동기 방식의 서비스 간 호출빠른 응답, 명확한 계약, 통합 단순
Messaging / Event 기반 통신비동기 이벤트 기반 통합느슨한 결합, 확장성 및 복원력 강화
Shared DB / Data Sharing동일 DB 또는 데이터 구조 공유빠른 통합 가능하지만 결합도 높음, 권장되지 않음

실무 사용 예시

📁 카테고리🛠️ 함께 사용하는 기술/방법🎯 주요 목적💡 기대 효과
1. 서비스 경계 정의 및 분리Bounded Context + API Gateway
Microservices + Context Mapping
Context Map
서비스 독립화, 명확한 경계 설정독립 배포, 팀 중심 개발, 유지보수 용이성, 경계 명확화
2. 도메인 설계 및 탐색Event Storming
Domain Storytelling
Shared Language
도메인 모델 발굴, 도메인 전문가와 협업빠른 피드백, 반복적 개선, 개발자 - 도메인 전문가 소통 강화
3. 핵심 도메인 최적화CQRS + Core Subdomain
Bounded Context + CQRS
Ubiquitous Language
성능 분리, 복잡성 관리, 읽기/쓰기 모델 분리핵심 도메인 경량화, 성능 최적화, 복잡도 국한
4. 공통 기능 공유 및 통합Shared Kernel
ACL (Anti-Corruption Layer)
중복 제거, 이질 시스템 간 통합통합 비용 절감, 모델 일관성 확보, 버전 호환 유연화
5. 개발 조직 정렬Context-Team Alignment
Bounded Context
조직 구조와 도메인 구조 정렬팀 책임 명확화, 배포 독립성 향상
6. 의존성 및 유지보수 관리Bounded Context + API
Separate Ways
코드 및 시스템 간 결합도 최소화유지보수성 향상, 느슨한 결합
7. 인프라 및 배포 전략DevOps 파이프라인
Context Map 기반 독립 배포
컨텍스트별 CI/CD, 안정적인 운영배포 자동화, 배포 속도 향상, 실패 격리 가능
8. 확장성과 유연성 확보마이크로서비스 + 모듈화
클라우드 네이티브 아키텍처
확장 가능하고 유연한 구조 설계자원 효율성, 독립적 확장, 고가용성 구조 확보

활용 사례

사례 1: 전자상거래 플랫폼 구축 사례

시스템 구성:

시스템 구성 다이어그램:

graph TB
    subgraph "Customer Experience"
        Web[Web Frontend]
        Mobile[Mobile App]
    end
    
    subgraph "Core Business Contexts"
        OM[Order Management]
        INV[Inventory]
        PAY[Payment]
        SHIP[Shipping]
        CUST[Customer]
    end
    
    subgraph "Supporting Contexts"
        NOT[Notification]
        REP[Reporting]
        AUTH[Authentication]
    end
    
    Web --> OM
    Mobile --> OM
    OM --> INV
    OM --> PAY
    OM --> SHIP
    OM --> CUST
    OM --> NOT
    
    INV -.->|Events| REP
    PAY -.->|Events| REP
    SHIP -.->|Events| REP

활용 워크플로:

  1. 도메인 분석 단계

    • EventStorming 을 통한 주문 프로세스 모델링
    • 도메인 전문가와 핵심 이벤트 식별
    • 하위 도메인 분류 (Core: 주문, Supporting: 재고/배송, Generic: 인증)
  2. Bounded Context 설계

    • 각 컨텍스트의 Ubiquitous Language 정의
    • 컨텍스트 간 통합 패턴 선택
    • Anti-Corruption Layer 설계
  3. Context Mapping

    • Order → Inventory: Customer-Supplier 관계
    • Order → Payment: Partnership 관계
    • Order → Shipping: Customer-Supplier 관계

Strategic Design 의 역할:

사례 2: 이커머스 주문처리 시스템

시스템 구성 및 워크플로우:

graph LR
  subgraph Catalog_BC
    CatalogAPI
  end
  subgraph Order_BC
    OrderAPI
  end
  subgraph Payment_BC
    PaymentAPI
  end
  Catalog_BC -->|ACL| Order_BC
  Order_BC -->|Customer–Supplier| Payment_BC

Workflow

  1. 카탈로그 BC: 제품 조회
  2. 주문 BC: 주문 생성 시 카탈로그에서 ACL 통해 데이터 조회
  3. 결제 BC: 주문 BC 가 고객으로서 결제 요청
  4. BC 간 명확한 경계와 계약 기반 통합

구현 예시

Strategic Design 패턴을 활용한 전자상거래 시스템 구현

  1. Bounded Context: Order Management 와 Inventory Management 로 명확히 구분
  2. Ubiquitous Language: 각 컨텍스트에서 도메인 특화 용어 사용
  3. Domain Events: 컨텍스트 간 느슨한 결합 통신
  4. Context Integration: Customer-Supplier 패턴 구현
  5. Anti-Corruption Layer: 외부 시스템과의 안전한 통합
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
from abc import ABC, abstractmethod
from typing import List, Dict, Optional
from dataclasses import dataclass, field
from datetime import datetime
import uuid

# =============================================================================
# Domain Events (도메인 이벤트)
# =============================================================================

@dataclass
class DomainEvent:
    """도메인 이벤트 기본 클래스"""
    event_id: str = field(default_factory=lambda: str(uuid.uuid4()))
    occurred_at: datetime = field(default_factory=datetime.now)
    
class OrderCreated(DomainEvent):
    """주문 생성 이벤트"""
    def __init__(self, order_id: str, customer_id: str, items: List[Dict]):
        super().__init__()
        self.order_id = order_id
        self.customer_id = customer_id
        self.items = items

class InventoryReserved(DomainEvent):
    """재고 예약 이벤트"""
    def __init__(self, order_id: str, product_id: str, quantity: int):
        super().__init__()
        self.order_id = order_id
        self.product_id = product_id
        self.quantity = quantity

# =============================================================================
# Bounded Context: Order Management (주문 관리)
# =============================================================================

class OrderManagementContext:
    """
    주문 관리 Bounded Context
    Ubiquitous Language: Order, Customer, Product, OrderItem
    """
    
    def __init__(self):
        self.orders: Dict[str, 'Order'] = {}
        self.event_publisher = EventPublisher()
    
    def create_order(self, customer_id: str, items: List[Dict]) -> str:
        """주문 생성 - 핵심 비즈니스 로직"""
        order_id = str(uuid.uuid4())
        
        # Ubiquitous Language 사용: Order Domain Model
        order = Order(
            order_id=order_id,
            customer_id=customer_id,
            items=[OrderItem(**item) for item in items],
            status=OrderStatus.PENDING
        )
        
        self.orders[order_id] = order
        
        # Domain Event 발행
        event = OrderCreated(order_id, customer_id, items)
        self.event_publisher.publish(event)
        
        return order_id
    
    def get_order(self, order_id: str) -> Optional['Order']:
        """주문 조회"""
        return self.orders.get(order_id)

@dataclass
class Order:
    """주문 Aggregate Root"""
    order_id: str
    customer_id: str
    items: List['OrderItem']
    status: 'OrderStatus'
    created_at: datetime = field(default_factory=datetime.now)

@dataclass  
class OrderItem:
    """주문 항목 Value Object"""
    product_id: str
    quantity: int
    price: float

class OrderStatus:
    """주문 상태 Value Object"""
    PENDING = "PENDING"
    CONFIRMED = "CONFIRMED"
    SHIPPED = "SHIPPED"
    DELIVERED = "DELIVERED"

# =============================================================================
# Bounded Context: Inventory Management (재고 관리)
# =============================================================================

class InventoryManagementContext:
    """
    재고 관리 Bounded Context
    Ubiquitous Language: Product, Stock, Availability
    """
    
    def __init__(self):
        self.inventory: Dict[str, 'ProductStock'] = {}
        self.event_publisher = EventPublisher()
        
        # 샘플 데이터
        self.inventory = {
            "product-1": ProductStock("product-1", 100),
            "product-2": ProductStock("product-2", 50)
        }
    
    def check_availability(self, product_id: str, quantity: int) -> bool:
        """재고 가용성 확인"""
        stock = self.inventory.get(product_id)
        return stock is not None and stock.available_quantity >= quantity
    
    def reserve_inventory(self, order_id: str, product_id: str, quantity: int) -> bool:
        """재고 예약 - Anti-Corruption Layer 역할"""
        if self.check_availability(product_id, quantity):
            stock = self.inventory[product_id]
            stock.reserve(quantity)
            
            # Domain Event 발행
            event = InventoryReserved(order_id, product_id, quantity)
            self.event_publisher.publish(event)
            return True
        return False

@dataclass
class ProductStock:
    """상품 재고 Aggregate"""
    product_id: str
    available_quantity: int
    reserved_quantity: int = 0
    
    def reserve(self, quantity: int):
        """재고 예약"""
        if self.available_quantity >= quantity:
            self.available_quantity -= quantity
            self.reserved_quantity += quantity
        else:
            raise ValueError("재고 부족")

# =============================================================================
# Context Integration: Event Publisher (컨텍스트 통합)
# =============================================================================

class EventPublisher:
    """
    Context Map 구현: Event-driven integration
    컨텍스트 간 느슨한 결합 통신
    """
    
    def __init__(self):
        self.subscribers: Dict[type, List] = {}
    
    def subscribe(self, event_type: type, handler):
        """이벤트 구독 등록"""
        if event_type not in self.subscribers:
            self.subscribers[event_type] = []
        self.subscribers[event_type].append(handler)
    
    def publish(self, event: DomainEvent):
        """이벤트 발행"""
        event_type = type(event)
        if event_type in self.subscribers:
            for handler in self.subscribers[event_type]:
                handler(event)

# =============================================================================
# Integration Patterns: Order-Inventory Context Mapping
# =============================================================================

class OrderInventoryIntegration:
    """
    Order Context와 Inventory Context 간 통합
    Pattern: Customer-Supplier (Order가 Customer, Inventory가 Supplier)
    """
    
    def __init__(self, order_context: OrderManagementContext, 
                 inventory_context: InventoryManagementContext):
        self.order_context = order_context
        self.inventory_context = inventory_context
        
        # Event 기반 통합 설정
        order_context.event_publisher.subscribe(OrderCreated, self.handle_order_created)
    
    def handle_order_created(self, event: OrderCreated):
        """주문 생성 시 재고 예약 처리"""
        print(f"주문 생성됨: {event.order_id}")
        
        for item in event.items:
            success = self.inventory_context.reserve_inventory(
                event.order_id, 
                item['product_id'], 
                item['quantity']
            )
            
            if success:
                print(f"재고 예약 성공: {item['product_id']} x {item['quantity']}")
            else:
                print(f"재고 부족: {item['product_id']}")

# =============================================================================
# Strategic Design 시나리오 실행
# =============================================================================

def demonstrate_strategic_design():
    """Strategic Design 패턴 실증"""
    
    print("=== Strategic Design in DDD 실증 ===\n")
    
    # 1. Bounded Context 생성
    order_context = OrderManagementContext()
    inventory_context = InventoryManagementContext()
    
    # 2. Context Integration 설정
    integration = OrderInventoryIntegration(order_context, inventory_context)
    
    # 3. 비즈니스 시나리오 실행
    print("1. 고객 주문 생성")
    order_items = [
        {"product_id": "product-1", "quantity": 2, "price": 29.99},
        {"product_id": "product-2", "quantity": 1, "price": 49.99}
    ]
    
    order_id = order_context.create_order("customer-123", order_items)
    print(f"주문 ID: {order_id}\n")
    
    # 4. Context Map을 통한 상호작용 확인
    print("2. 컨텍스트 간 상호작용 결과")
    order = order_context.get_order(order_id)
    print(f"주문 상태: {order.status}")
    
    print(f"재고 현황:")
    for product_id, stock in inventory_context.inventory.items():
        print(f"  {product_id}: 가용 {stock.available_quantity}, 예약 {stock.reserved_quantity}")

if __name__ == "__main__":
    demonstrate_strategic_design()

실무에서 효과적으로 적용하기 위한 고려사항 및 주의할 점

카테고리핵심 고려사항설명권장 사항 / 실천 방법
도메인 분석도메인 경계 명확화Bounded Context 를 기준으로 비즈니스 도메인을 구체적으로 구분Event Storming, Domain Storytelling 활용
도메인 지식 확보깊이 있는 비즈니스 이해 없이는 도메인 모델 설계 불가도메인 전문가와 정기 협업, 인터뷰, Shadowing
공유 언어 (Ubiquitous Language)도메인 내의 모든 구성원이 동일한 용어를 사용해야 일관된 모델 유지 가능용어 사전 작성 및 주기적 업데이트, 문서화 프로세스 포함
조직 및 팀 구조컨텍스트 중심 팀 구성Bounded Context 단위로 팀을 분리하여 자율적 운영 체계 구축크로스 펑셔널 팀 구성, 팀 간 인터페이스 명확화
책임/권한 분리각 컨텍스트별 소유자 명확히 정의, 업무 충돌 방지팀별 명세 관리 책임 설정, 리더 지정
적용 전략점진적 적용시스템 전체를 한 번에 DDD 로 전환하면 리스크 큼Core Domain 중심 MVP 구축 → 점진적 확장
컨텍스트 크기 조절너무 작거나 크면 유지보수 어려움Conway 의 법칙 고려하여 팀 규모와 연계, Context Map 활용
기술 및 통합 전략통합 전략 설계컨텍스트 간 통신 및 데이터 흐름 정의 필요OHS, ACL, Customer-Supplier 등 적절한 통합 패턴 적용
API 및 이벤트 계약 관리API/이벤트는 명시적 계약 기반이어야 함OpenAPI, Schema Registry, 버전 관리 정책 수립
기술 스택 최적화각 도메인의 특성과 목적에 따라 기술을 선택해야 유연성 확보CQRS, Event Sourcing, RDB/NoSQL 등 도메인 중심 기술 선택
도구 및 프로세스도구 활용효과적인 커뮤니케이션과 모델링을 위한 도구 필요Miro, Context Mapper, EventStorming 툴 등 실습 기반 도입
문서화 및 지속적 관리모델/용어/계약은 지속적으로 진화하며 관리되어야 함자동화된 문서화 (Swagger, Markdown), 정기 리뷰 회의
조직 문화협업 문화 구축도메인 중심의 설계는 팀 간 소통이 핵심정기 미팅, 리뷰 문화, 공동 워크숍 및 리더십 참여
변화 수용과 학습도입 과정에서 발생하는 불확실성과 조직 저항에 대한 유연한 대응실패 수용, 실험적 전환, 사내 DDD 학습 커뮤니티 운영

최적화하기 위한 고려사항 및 주의할 점

카테고리고려사항/이슈설명실무 권장사항
경계 설계경계 (Bounded Context) 재조정 필요초기 정의된 컨텍스트가 현실과 맞지 않거나 지나치게 작거나 클 수 있음핵심 서브도메인부터 시작해 점진적으로 확장. 정기적 Event Storming 워크숍 수행
통신 최적화과도한 동기 호출 지양RESTful API 중심 구조는 컨텍스트 간 통신 병목 유발 가능이벤트 기반 아키텍처 (Event-Driven), 비동기 메시징 (RabbitMQ/Kafka) 활용
데이터 일관성데이터 동기화 문제비동기 환경에서 데이터 불일치 발생 가능 (예: 주문 상태 vs 결제 상태)Saga 패턴, 보상 트랜잭션, Eventually Consistent 모델 설계
의존성 관리컨텍스트 간 강결합 발생Shared Kernel, Conformist 등은 유지보수 비용 증가 위험 존재API 계약 기반 설계, ACL 도입, 명시적 Published Language 정의
배포 및 운영독립 배포 어려움컨텍스트 간 코드 공유, 상태 공유 시 단일 배포 강제될 수 있음컨텍스트별 CI/CD 구성, Blue-Green/Canary 배포 전략, Feature Flag 활용
보안 전략인증/인가 체계 통합 미비컨텍스트별 보안 요구사항 다르며, 일괄 적용이 어려움API Gateway 에서 인증/인가 처리, OAuth2, JWT 기반 인증 연동
관측 가능성장애 추적 및 진단 어려움분산된 컨텍스트 환경에서 문제 지점 파악이 어려움OpenTelemetry, Zipkin, Prometheus 등으로 통합 로깅 및 추적 시스템 구성
테스트 전략통합 테스트 어려움컨텍스트 간 메시지 기반 통신 시 테스트 복잡도 증가Contract Testing(Pact 등), Consumer-Driven Test, Integration Test 분리
기술 확장성컨텍스트마다 기술 이질성 존재서로 다른 기술 스택과 설계 기준 사용 시 통합 복잡도 상승표준화된 메시지 포맷 사용 (Protobuf, Avro), ContextMapper 등으로 구조 자동화
변경 관리 체계모델 또는 API 변경 혼선Upstream 의 변경이 Downstream 에 급격한 영향버전 관리 (V1/V2), 구형 모델 호환 어댑터 제공, 변경 알림 시스템 구축
도구 활용수동 설계의 한계Bounded Context, Context Map 관리에 시간이 소요됨Context Mapping → ArchUnit, ContextMapper 등 코드 자동화 도구 활용
성능 최적화처리 지연 및 과부하 발생트래픽 집중 BC 또는 병목이 발생할 수 있음Bulk API, 캐싱 전략 (Redis), 오토 스케일링 (HPA) 도입

주제와 관련하여 주목할 내용

구분카테고리항목설명
핵심 개념도메인 구조Bounded Context도메인 모델이 유효한 경계를 정의하고, 해당 범위 내 일관된 설계를 유지함.
하위 도메인 분리Core, Supporting, Generic비즈니스 중심 가치 기준으로 도메인을 분류하여 설계/투자 우선순위 결정 가능.
공유 언어 (Ubiquitous Language)도메인 공통 언어 사용팀 간 용어 불일치 제거, 모델 - 코드 - 커뮤니케이션 간 정렬 확보.
방법론협업 기반 모델링 기법EventStorming도메인 이벤트를 중심으로 시각적으로 프로세스를 모델링하는 협업 기법.
Domain Storytelling액터 중심의 도메인 스토리 플로우를 통해 사용자와 시스템의 상호작용을 명확화.
설계 도구모델링 도구Context MapperContext Map, Bounded Context 설계를 위한 시각화 및 관리 도구.
Bounded Context Canvas컨텍스트의 이름, 책임, 인터페이스, 모델 등을 명확히 문서화하는 캔버스 템플릿.
패턴컨텍스트 통합 전략Shared Kernel공통 모델 공유, 철저한 협업 필요. 공통 계약/모델에 대한 양측 책임 공유.
ACL (Anti-Corruption Layer)번역 계층으로 외부 시스템과의 간접 통합, 도메인 모델 보호.
Customer-Supplier소비자 (Downstream) 가 공급자 (Upstream) 와의 계약에 따라 모델을 수용.
Conformist외부 API/모델을 그대로 수용, 유연성보다 일관성을 우선시.
Separate Ways완전한 모델 분리로 통합 최소화. 각 도메인이 독립적으로 진화.
아키텍처레이어 구조Hexagonal Architecture포트 - 어댑터 기반. 도메인을 외부로부터 격리하고, 입출력을 유연하게 관리.
Onion Architecture내부 도메인 중심의 계층 구성. 의존성은 안쪽으로 향하고 외부는 도메인에 의존.
데이터 전략상태 및 이벤트 처리Event Sourcing상태 저장 대신 이벤트 시퀀스를 저장하여 변경 추적, 재구성 가능.
CQRS (Command Query Responsibility Segregation)명령 (쓰기) 과 조회 (읽기) 모델 분리로 성능 최적화.
Database per Service각 서비스마다 독립된 DB 를 보유. 서비스 간 강결합 방지 및 장애 전파 최소화.
사례 및 적용조직/사례 전략Elixir University 사례Bounded Context 분리, 컨텍스트 매핑 사례로 실전 적용 기반 제공.
조직 구조Conway’s Law조직 구조가 소프트웨어 구조에 영향을 주므로, 팀 구성과 도메인 정렬이 필요함.
점진적 전환Strangler Fig Pattern레거시를 유지하며 신규 시스템을 점진적으로 도입해 전체 전환 유도.
워크숍/실행협업 기반 실행 전략Context Mapping Workshop여러 BC 간의 관계를 시각화하고, 통합 전략을 명확히 설계하는 공동 워크숍.
용어 정리/사전 작성도메인 용어의 일관성 확보 및 팀 간 커뮤니케이션 효율화.

주제와 관련하여 반드시 학습해야할 내용

구분카테고리주제항목설명
핵심 개념도메인 주도 설계Domain-Driven Design (DDD)전체 개요Strategic + Tactical Design 모두 포함하는 도메인 중심 설계 방법론의 전반적 이해
Bounded Context경계 컨텍스트 정의도메인 모델이 유효한 경계를 갖는 설계 단위. 마이크로서비스 분해의 기준이 됨.
Ubiquitous Language공유 언어비즈니스와 개발팀 간 언어 일치. 모델, 코드, 문서, 커뮤니케이션을 정렬시키는 핵심 요소
Context Map컨텍스트 맵핑여러 Bounded Context 간 관계, 통합 전략, 방향성 (Upstream/Downstream) 을 시각화
설계 기법도메인 설계 기법Domain Modeling도메인 객체, 엔티티, 밸류, 애그리거트 설계도메인 로직을 표현하는 전반적인 설계 기술. Tactical Design 과 직접 연결됨.
Aggregate Pattern일관성 경계트랜잭션 경계와 도메인 객체 집합의 경계를 정의하여 무결성을 보장함.
Integration Patterns컨텍스트 통합 전략Shared Kernel, ACL, OHS 등 전략에 따라 BC 간 통신/통합 방식 결정됨.
아키텍처시스템 설계 구조Microservices ArchitectureBounded Context 기반 분해BC 를 기준으로 마이크로서비스 분할, 독립 배포/개발/확장성 확보
Event-Driven Architecture느슨한 결합 구조이벤트 발행 - 구독 모델 기반의 비동기 메시징 구조. 통합 지연 및 실패 대응에 유리
Database per Service데이터 분리 전략각 서비스의 독립적인 데이터 저장소 운영, 스키마 충돌/의존도 최소화
조직 전략협업 및 정렬 전략Team Topologies팀 구조와 아키텍처 정렬조직 구조 (스트림 얼라인드 팀 등) 와 설계 구조 (BC) 간의 정렬로 생산성과 속도 향상
Conway’s Law조직 구조 = 시스템 구조조직의 커뮤니케이션 구조가 시스템 구조를 결정한다는 설계 원칙
적용 방법도구 및 실천 전략EventStorming협업 모델링 도구도메인 이벤트 중심의 시각적 모델링. 컨텍스트 정의 및 도메인 흐름 분석에 유리
Context Mapping Workshop관계 정의 워크숍여러 BC 간의 관계를 정의하고, 통합 패턴 적용 및 설계 합의를 위한 협업적 분석 방식
Bounded Context Canvas컨텍스트 문서화 도구목적, 책임, 인터페이스, 언어 등을 명시적으로 정리하여 팀 간 설계 일관성을 확보

용어 정리

카테고리용어설명
핵심 개념Domain-Driven Design (DDD)복잡한 도메인 문제 해결을 위한 모델 기반 소프트웨어 설계 접근법
Strategic Design (전략적 설계)도메인 분리, Bounded Context 정의, 컨텍스트 간 관계 설계 중심
Tactical Design (전술적 설계)Entity, Value Object, Aggregate 등 구현 중심의 설계 구성 요소
도메인 구조Domain (도메인)비즈니스 문제와 규칙이 존재하는 문제 공간
Subdomain (하위 도메인)도메인을 Core, Supporting, Generic 으로 세분화한 단위
Problem Space (문제 공간)고객 가치와 비즈니스 문제 정의 영역
Solution Space (해결 공간)소프트웨어로 문제를 해결하는 설계 및 구현 공간
경계 및 모델Bounded Context (경계 컨텍스트)특정 도메인 모델이 일관성 있게 적용되는 명확한 책임 경계 단위
Context Map (컨텍스트 맵)Bounded Context 간 관계 및 통합 전략을 시각화한 다이어그램
Ubiquitous Language (공통 언어)도메인 전문가와 개발자가 공유하는 일관된 용어 체계
통합 패턴Shared Kernel (공유 커널)두 컨텍스트 간 일부 모델을 신중하게 공유하는 전략
Customer–Supplier (고객–공급자)Upstream(공급자) 와 Downstream(소비자) 간 명확한 역할 기반 통합 패턴
Conformist (순응자)Downstream 이 Upstream 의 모델/계약을 그대로 수용하는 패턴
Open Host Service (공개 호스트 서비스)외부 접근을 위한 표준화된 API/이벤트 인터페이스를 제공하는 패턴
Published Language (공개 언어)컨텍스트 간 메시지 교환을 위한 표준 스키마 및 언어 정의
Anti-Corruption Layer (ACL)외부 모델로부터의 오염 방지를 위해 변환 계층을 두는 보호 전략
Partnership (파트너십)두 컨텍스트가 공동 목표를 위해 협력하고 모델/계약을 공동 관리하는 관계
Separate Ways (독립 진화)통합 없이 각자 독립적으로 발전하는 선택적 분리 전략
설계 기법EventStorming도메인 이벤트를 중심으로 도메인 흐름을 시각화하는 협업 모델링 기법
Domain Storytelling도메인 워크플로우를 스토리 기반으로 시각화하는 분석 기법
설계 도구Bounded Context CanvasBounded Context 를 구조적으로 정의하기 위한 템플릿 도구
Context MapperContext Map 및 관계 모델링을 위한 도구
아키텍처 원칙Conway’s Law (컨웨이 법칙)조직 구조가 시스템 아키텍처에 직접적인 영향을 준다는 법칙
Inverse Conway Maneuver (역전 전략)원하는 아키텍처를 달성하기 위해 조직 구조를 먼저 설계하는 전략
아키텍처 패턴Microservices ArchitectureBounded Context 를 독립 마이크로서비스로 분해하는 설계 스타일
Hexagonal Architecture도메인 로직을 어댑터/포트를 통해 외부와 분리하는 계층형 아키텍처
Onion Architecture도메인 중심의 계층 구조로, 의존성 역전 원칙을 강조
설계 기법Event Sourcing상태 변화를 이벤트로 저장하여 재구성하는 상태 관리 기법
CQRS (Command Query Responsibility Segregation)명령과 조회를 분리하여 성능과 확장성을 최적화하는 패턴

참고 및 출처

핵심 문헌

온라인 리소스

개념 및 설계 설명

전략적 설계 심화

실무 도구 및 플랫폼

커뮤니티 및 교육

기술 블로그 및 사례 연구