Files
2nd/10_Wiki/Topics/도메인_주도_설계_Domain-Driven_Design,_DDD.md
T
2026-05-02 23:55:09 +09:00

9.4 KiB

category, tags, title, description, last_updated
category tags title description last_updated
Unified
auto-wikified
technical-documentation
도메인 주도 설계 (Domain-Driven Design, DDD) 도메인 주도 설계(DDD)는 에릭 에반스(Eric Evans)가 대중화한 소프트웨어 설계 접근법으로, 복잡한 비즈니스 로직을 애플리케이션의 핵심에 두고 개발 프로세스를 비즈니스 도메인에 대한 깊은 이해에 맞추는 것을 목표로 합니다 [1]. 2026-05-02

도메인 주도 설계 (Domain-Driven Design, DDD)

📌 Brief Summary

도메인 주도 설계(DDD)는 에릭 에반스(Eric Evans)가 대중화한 소프트웨어 설계 접근법으로, 복잡한 비즈니스 로직을 애플리케이션의 핵심에 두고 개발 프로세스를 비즈니스 도메인에 대한 깊은 이해에 맞추는 것을 목표로 합니다 [1]. 기술 팀과 도메인 전문가 간의 긴밀한 협력을 촉진하며, '보편적 언어(Ubiquitous Language)'라는 공유 어휘를 통해 의사소통 격차를 해소합니다 [1]. 또한 대규모 시스템을 '바운디드 컨텍스트(Bounded Context)'라는 더 작고 관리하기 쉬운 하위 도메인으로 분할하여 독립적인 관리와 진화를 돕는 아키텍처 패턴입니다 [2-5].

📖 Core 소스 Content

  • 주요 개념 및 패턴:

    • 바운디드 컨텍스트 (Bounded Context): 크고 복잡한 도메인을 독립적으로 구현하고 발전시킬 수 있는 모듈화된 작은 하위 도메인으로 분리한 것입니다 [2, 4, 5]. 각 컨텍스트는 고유한 모델과 보편적 언어를 가지며, 명확한 경계를 통해 모델 간의 혼합과 중첩을 방지합니다 [2, 5].
    • 보편적 언어 (Ubiquitous Language): 프로젝트의 모든 구성원(개발자 및 비즈니스 이해관계자)이 공통으로 사용하는 언어로, 대화, 문서, 그리고 코드 그 자체에 일관되게 사용되어야 합니다 [1, 5, 6].
    • 애그리거트 (Aggregates): 단일 단위로 취급될 수 있는 도메인 객체들의 클러스터로, 애그리거트의 루트가 전체 클러스터의 일관성을 보장합니다 [2].
    • 엔티티(Entities)와 값 객체(Value Objects): DDD는 명확한 식별성을 지닌 객체인 '엔티티'와 순수하게 속성으로만 정의되는 '값 객체'를 구별하여 모델링합니다 [2].
  • 코드베이스 구조와 독해 접근:

    • DDD가 적용된 코드베이스는 기술적인 기능이 아닌 '주문 관리', '고객 지원'과 같이 비즈니스 용어로 명명된 모듈 구조(바운디드 컨텍스트 중심)를 갖습니다 [2, 7].
    • 이러한 구조적 특징 덕분에 코드를 읽는 개발자는 세부 로직에 매몰되기 전에 비즈니스 의도와 도메인 목적을 먼저 파악할 수 있는 인지적 기반을 얻게 됩니다 [7].
    • 핵심 도메인 로직은 데이터베이스나 UI 프레임워크와 같은 인프라 관심사로부터 철저히 분리(격리)되어 깔끔하고 테스트 가능한 모델을 형성합니다 [6].
    • 도메인을 탐구하고 도메인 이벤트, 명령 및 애그리거트를 빠르게 식별하기 위해 이벤트 스토밍(Event Storming)과 같은 협업 워크샵이 활용됩니다 [6].

⚖️ Trade-offs & Caveats

  • 장점: 도메인 모델이 비즈니스 요구사항에 강하게 정렬되며, 개별 바운디드 컨텍스트의 독립성 덕분에 단위 테스트와 병렬 개발이 용이합니다 [8-10]. 또한 시스템의 한 부분에 있는 버그가 다른 부분에 영향을 미치지 않아 유지보수가 쉬우며, 비즈니스 요구 변화에 맞춘 확장(Scalable)이 원활합니다 [10]. 모듈형 모놀리스나 마이크로서비스 설계의 훌륭한 기준점이 됩니다 [11, 12].
  • 단점 (제약 사항): 구현 복잡도(Implementation Complexity)가 매우 높습니다 [8]. 도메인 전문가와의 심도 있는 협업과 깊이 있는 도메인 모델링을 필요로 하므로, 분석에 많은 시간과 자원(Medium-High Resource Requirements)이 소모됩니다 [8]. 따라서 단순한 애플리케이션보다는 금융, 의료, 이커머스 등 복잡한 비즈니스 도메인에 적용하는 것이 이상적입니다 [8].

🔗 Knowledge Connections

[관계 유형 A: 아키텍처/기반 기술]

  • 바운디드 컨텍스트 (Bounded Context)
    • 연결 이유: DDD에서 대규모 시스템을 나누는 핵심 경계 단위이기 때문입니다 [2, 5].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 마이크로서비스 아키텍처나 모듈형 모놀리스를 설계할 때 모듈과 서비스의 책임을 어떻게 물리적/논리적으로 분할해야 하는지 이해할 수 있습니다 [12, 13].
  • 클린 아키텍처 (Clean Architecture)
    • 연결 이유: DDD와 마찬가지로 핵심 비즈니스 로직을 데이터베이스나 프레임워크 등 외부 인프라로부터 철저히 격리/보호하는 것을 핵심 원칙으로 삼기 때문입니다 [7, 14].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: DDD의 도메인 로직이 외부 기술 계층에 오염되지 않고 순수하게 유지되는 코드 구조를 파악할 수 있습니다 [6, 14].

[관계 유형 B: 구현/활용 도구]

  • 보편적 언어 (Ubiquitous Language)
    • 연결 이유: DDD의 가장 핵심적인 의사소통 수단이자, 도메인 전문가와 개발자 사이의 언어 통합 수단입니다 [1, 5, 6].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 코드베이스 내의 클래스명, 변수명, 패키지명이 비즈니스 규칙과 얼마나 일치하는지 분석하여 코드의 실제 역할을 효율적으로 독해하는 데 기여합니다 [6, 7].
  • 이벤트 스토밍 (Event Storming)
    • 연결 이유: DDD를 실제 프로젝트에 적용할 때 비즈니스 도메인을 탐구하고 모델링하기 위해 사용하는 대표적인 협업 기법입니다 [6].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 시스템 내에서 발생하는 도메인 이벤트와 애그리거트의 관계를 도출하는 과정을 이해할 수 있습니다 [6].

Deeper Research Questions

  • DDD의 엔티티(Entity)와 값 객체(Value Object)는 소스 코드 상에서 구체적으로 어떻게 구분하여 구현되며, 이들의 설계 차이가 데이터베이스 영속성 처리에 어떤 영향을 미치는가?
  • 바운디드 컨텍스트 간의 관계와 통신 방식을 정의하는 '컨텍스트 매핑(Context Mapping)'은 분산 환경의 API 연동(REST, gRPC)이나 이벤트 메시징 설계에 어떻게 적용되는가?
  • 기존의 데이터 중심(Data-driven)으로 설계된 거대한 레거시 모놀리식 코드베이스를 DDD 기반의 바운디드 컨텍스트 단위로 점진적으로 마이그레이션할 때 발생하는 가장 큰 장애물과 해결 전략은 무엇인가?
  • 특정 디렉토리 구조를 분석할 때, 해당 코드가 DDD의 계층 분리 원칙과 바운디드 컨텍스트의 경계(예: UI가 DB를 직접 호출하는 등 의존성 위반)를 적절히 준수하고 있는지 효율적으로 식별하는 방법은 무엇인가?
  • 이벤트 스토밍을 통해 도출된 도메인 이벤트가 실제 구현 단계에서 '이벤트 기반 아키텍처(Event-Driven Architecture)'의 비동기 메시징 구조로 어떻게 이어지는가?

Practical Application Contexts

  • Implementation: 프레임워크나 DB 접근 코드와 혼재되지 않은 순수한 형태의 애그리거트, 엔티티, 값 객체 등 핵심 도메인 객체를 구현하는 데 사용됩니다 [2, 6].
  • System Design: 복잡한 시스템(이커머스의 유저 관리, 주문 처리, 인벤토리 등)의 서비스 경계를 바운디드 컨텍스트를 기준으로 설계하여 상호 결합도를 낮추고 독립적인 확장이 가능하게 합니다 [4, 5].
  • Operation / Maintenance: 모듈화된 컨텍스트 구조 덕분에 시스템 일부의 버그 수정이나 변경 사항이 다른 파트로 번지는 것을 막아 유지보수성을 극대화합니다 [10].
  • Learning Path: 낯설고 방대한 코드베이스를 읽을 때 하향식, 상향식 추적에 앞서 비즈니스 용어 기반의 폴더 구조와 보편적 언어를 먼저 스캔하여 설계의 의도(Context)를 우선적으로 파악하는 멘탈 모델을 형성합니다 [7].
  • My Project Relevance: 거대하고 복잡한 엔터프라이즈 코드베이스를 읽고 구조를 파악하거나, 마이크로서비스 또는 모듈형 모놀리스 기반으로 시스템을 리팩터링/설계할 때 모듈 분할 및 도메인 지식 추출의 전략적 기준으로 활용할 수 있습니다.

Adjacent Topics

  • 이벤트 기반 아키텍처 (Event-Driven Architecture)
    • 확장 방향: DDD에서 식별된 도메인 이벤트가 분산 시스템 간에 상태 변경을 알리기 위해 비동기적으로 어떻게 활용되는지, 메시지 브로커(Kafka 등)와 함께 어떻게 구현되는지 연계하여 탐구합니다 [15, 16].
  • C4 모델 (C4 Model)
    • 확장 방향: 식별한 바운디드 컨텍스트와 컴포넌트 경계를 여러 이해관계자가 직관적으로 이해할 수 있는 아키텍처 다이어그램으로 시각화하고 문서화하는 방안으로 지식을 확장합니다 [17-19].

Last updated: 2026-05-02