4.8 KiB
4.8 KiB
category, tags, title, description, last_updated
| category | tags | title | description | last_updated | ||||
|---|---|---|---|---|---|---|---|---|
| Unified |
|
Domain-Driven Design (DDD) | 비즈니스 도메인의 복잡성을 해결하기 위해 기술과 비즈니스를 정렬하고 공통 언어를 기반으로 설계하는 방법론 | 2026-05-02 |
Domain-Driven Design (DDD)
📌 Brief Summary
**도메인 주도 설계(Domain-Driven Design, DDD)**는 소프트웨어 개발의 중심을 기술이 아닌 비즈니스 도메인에 두는 설계 접근 방식입니다. 에릭 에반스(Eric Evans)에 의해 정립된 이 방법론은 도메인 전문가와 개발자 간의 간극을 줄이기 위해 공통의 언어(Ubiquitous Language)를 구축하고, 시스템을 논리적 경계인 **바운디드 컨텍스트(Bounded Context)**로 나누어 관리 가능한 수준의 복잡성을 유지합니다.
📖 Core Content
1. 전략적 설계 (Strategic Design)
비즈니스 문제를 큰 틀에서 분석하고 시스템의 경계를 정의합니다.
- 유비쿼터스 언어 (Ubiquitous Language): 도메인 전문가, 기획자, 개발자가 프로젝트 전반에서 사용하는 공통 어휘입니다. 이 언어는 문서, 대화뿐만 아니라 코드(클래스명, 메서드명)에도 그대로 반영되어야 합니다.
- 바운디드 컨텍스트 (Bounded Context): 유비쿼터스 언어가 적용되는 논리적인 경계입니다. 동일한 단어(예: '상품')라도 컨텍스트(주문 vs 배송)에 따라 그 의미와 모델이 다를 수 있음을 인정하고 격리합니다.
- 컨텍스트 맵 (Context Map): 서로 다른 바운디드 컨텍스트 간의 관계(협력, 의존 등)를 시각화한 지도입니다.
2. 전술적 설계 (Tactical Design)
바운디드 컨텍스트 내부의 구체적인 모델링 도구들을 제공합니다.
- 엔티티 (Entities): 식별자(ID)에 의해 정의되는 객체입니다. 속성이 변하더라도 식별자가 같다면 동일한 객체로 간주합니다.
- 값 객체 (Value Objects): 속성값 그 자체로 정의되는 객체입니다. 식별자가 없으며 보통 불변(Immutable) 상태로 관리됩니다.
- 애그리거트 (Aggregates): 데이터 변경의 단위로 취급되는 도메인 객체들의 군집입니다. 각 애그리거트는 '루트(Root)' 엔티티를 통해 외부와 소통하며 데이터 일관성을 보장합니다.
- 도메인 서비스 (Domain Services): 특정 엔티티나 값 객체에 속하기 어려운 비즈니스 로직을 처리하는 무상태(Stateless) 서비스입니다.
- 리포지토리 (Repositories): 애그리거트 루트를 영구 저장소에 저장하고 조회하기 위한 메커니즘을 제공합니다.
⚖️ Trade-offs & Caveats
✅ Benefits
- 비즈니스 정렬: 기술적 구현이 실제 비즈니스 요구사항과 정확히 일치하게 됩니다.
- 복잡성 관리: 거대한 시스템을 독립적인 컨텍스트로 나누어 인지적 과부하를 줄입니다.
- 유연성: 각 도메인이 독립적으로 진화할 수 있어 변화에 빠르게 대응할 수 있습니다.
⚠️ Challenges
- 높은 초기 비용: 도메인 전문가와의 긴밀한 협업과 분석 과정에 많은 시간이 소요됩니다.
- 설계 난이도: 바운디드 컨텍스트의 경계를 잘못 설정할 경우, 시스템 간의 결합도가 높아져 더 큰 혼란을 야기할 수 있습니다.
- 오버헤드: 비즈니스 로직이 단순한 CRUD 앱에서는 구조적 복잡성만 높이는 과잉 엔지니어링이 될 수 있습니다.
🔗 Knowledge Connections
Related Concepts
- Bounded_Context: DDD의 핵심적인 격리 단위입니다.
- Ubiquitous_Language: 팀 내 소통의 오류를 제거하는 기반 언어입니다.
- Clean_Architecture: 도메인을 중앙에 두고 인프라를 격리하는 구조적 틀을 제공합니다.
- Event_Storming: 비즈니스 흐름을 분석하여 DDD 모델을 도출하는 워크샵 기법입니다.
Practical Application Contexts
- Microservices: 바운디드 컨텍스트는 마이크로서비스를 나누는 가장 이상적인 기준점이 됩니다.
- Enterprise Systems: 복잡한 비즈니스 규칙이 얽힌 대규모 금융, 이커머스 시스템의 필수 설계 사상입니다.
💡 Adjacent Topics
- Microservices_Architecture: DDD의 전략적 설계를 통해 서비스 간 느슨한 결합을 구현합니다.
- Layered_Architecture: 기술적 계층 분리와 도메인 중심 분리의 차이를 이해하는 비교군입니다.
- Event_Driven_Architecture: 애그리거트 간의 상태 변경을 이벤트를 통해 전파하여 일관성을 유지합니다.
Last updated: 2026-05-02