9.4 KiB
9.4 KiB
category, tags, title, description, last_updated
| category | tags | title | description | last_updated | ||
|---|---|---|---|---|---|---|
| Unified |
|
도메인 주도 설계 (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
Related Concepts
[관계 유형 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