반응형
1. 프로세스와 무관한 패턴과 원칙의 집합, DDD 개요
1) DDD의 정의
DDD(Domain Driven Development)는 소프트웨어의 핵심 복잡성(Core Complexity)을 해결하기 위해 도메인 모델을 중심(Model-Driven Design)으로 설계·구현하는 소프트웨어 개발 접근법이다.
이 개념은 Eric Evans가 저서 Domain-Driven Design: Tackling Complexity in the Heart of Software에서 체계화하였다.
정의 요약
- 비즈니스 도메인을 중심으로 모델을 설계
- 모델과 코드의 정합성을 유지
- 개발자와 도메인 전문가 간 공통 언어(UBIQUITOUS LANGUAGE) 사용
- 프로세스 자체가 아니라 패턴·원칙·Best Practice 집합
2) DDD의 필요성
| 구분 | 전통적 개발 방식 문제 | DDD 접근 |
| 복잡성 관리 | 비즈니스 규칙이 분산됨 | 도메인 모델에 응집 |
| 요구사항 변화 | 변경 시 영향 범위 불명확 | Aggregate 단위 변경 |
| 개발-현업 간 소통 | 문서 중심, 해석 차이 발생 | UBIQUITOUS LANGUAGE 사용 |
| 코드 구조 | CRUD 중심 설계 | 도메인 행위 중심 설계 |
DDD는 특히 다음과 같은 환경에서 효과적이다:
- MSA 기반 복잡한 업무 시스템
- 비즈니스 규칙이 많은 금융/물류/ERP 시스템
- 장기 유지보수 프로젝트
2. DDD 구조도와 기본요소 및 특징
1) DDD Layered 구조도



계층 설명
| Layer | 책임 | 특징 |
| Presentation | UI/API | 외부 인터페이스 |
| Application | 유스케이스 orchestration | 트랜잭션 제어 |
| Domain | 핵심 비즈니스 로직 | Entity, Value, Aggregate |
| Infrastructure | DB, MQ, 외부시스템 | 기술 구현 |
핵심은 Domain Layer가 독립적이어야 한다는 점이다.
2) 도메인 모델(Domain Model)
도메인 모델은 다음을 포함한다:
- Domain 객체
- 비즈니스 규칙
- 제약조건
- 상태 및 행위
MODEL DRIVEN DESIGN의 핵심은
모델 = 설계 = 코드 의 일치성을 유지하는 것이다.
3) DDD 기본 요소 및 특징
| 구분 | 설명 |
| UBIQUITOUS LANGUAGE | 도메인 전문가와 개발자가 공유하는 공통 언어 |
| Bounded Context | 모델의 경계를 명확히 정의 |
| Aggregate | 트랜잭션 일관성 경계 |
| Repository | Aggregate 저장소 |
| Domain Service | Entity로 표현하기 어려운 로직 |
| Entity | 식별자 기반 객체 |
| Value Object | 불변 객체 |
| Domain Event | 상태 변화 이벤트 |
4) DDD 특징
- 도메인 중심 설계
- 객체지향 설계 원칙 강화
- 응집도 ↑ 결합도 ↓
- 복잡성의 구조화
- 전략적 설계(Strategic Design) + 전술적 설계(Tactical Design)
5) 효과적인 모델링 구성요소
- Bounded Context 명확화
- Context Mapping
- Aggregate 단위 설계
- 명확한 UBIQUITOUS LANGUAGE 정의
- 도메인 전문가 참여
3. DDD의 기본 구성 요소 (Tactical Pattern)
도메인 모델 기본 구성 요소 통합표
| 요소 | 정의 | 특징 | 예시 |
| Entity | 식별자를 가지는 객체 | 상태 변화 가능 | Order |
| Value Object | 값 자체가 의미 | 불변(Immutable) | Money |
| Aggregate | 객체 묶음 단위 | 일관성 경계 | Order + OrderLine |
| Repository | Aggregate 저장 | 인터페이스 중심 | OrderRepository |
| Domain Service | 특정 Entity에 속하지 않는 로직 | Stateless | PaymentService |
| Factory | 복잡한 생성 책임 | 생성 로직 캡슐화 | OrderFactory |
| Domain Event | 도메인 변화 표현 | 비동기 처리 가능 | OrderCreated |
주요 요소 상세
| Entity | Value Object | Aggregate | Repository | Service |
|
|
|
|
|
4. DDD 적용 전제사항과 Process
1) DDD 전제사항
| 항목 | 설명 |
| 복잡한 도메인 존재 | 단순 CRUD 시스템은 불필요 |
| 도메인 전문가 협업 가능 | UBIQUITOUS LANGUAGE 필요 |
| 장기 운영 시스템 | 단기 프로젝트에는 부적합 |
| 객체지향 이해도 확보 | 설계 역량 요구 |
2) DDD Process
- 도메인 탐색 (Domain Exploration)
- UBIQUITOUS LANGUAGE 정의
- Bounded Context 식별
- Aggregate 설계
- Repository 설계
- Domain Service 정의
- Infrastructure 연결
5. DDD 모델 구조와 계층 구조
1) 모델 구조


2) 계층 구조 통합 설명
| 구분 | 전략적 설계 | 전술적 설계 |
| 목적 | 도메인 경계 설정 | 모델 구현 |
| 구성 | Bounded Context, Context Map | Entity, Value, Aggregate |
| 관심사 | 시스템 전체 구조 | 객체 내부 구조 |
6. DDD 적용 시 고려사항
1) 도메인 로직 복잡성과 코드 재사용
- 복잡성 낮은 시스템 → 과도한 설계 위험
- Generic Framework 과용 지양
- 도메인 중심 응집 설계 유지
MSA 환경에서는 서비스 단위 = Bounded Context로 설계하는 것이 적합
2) 도메인 로직과 유지보수 관계
| 항목 | DDD 미적용 | DDD 적용 |
| 변경 영향 | 광범위 | Aggregate 단위 |
| 테스트 | 통합 테스트 중심 | 도메인 단위 테스트 가능 |
| 확장성 | 기술 중심 | 비즈니스 중심 |
결론
DDD는 단순한 설계 기법이 아니라:
- 복잡성 관리 전략
- 도메인 중심 개발 철학
- 모델 기반 설계(MODEL DRIVEN DESIGN)
- UBIQUITOUS LANGUAGE 기반 협업 체계
특히 MSA, Spring 기반 대규모 업무 시스템 환경에서는 Bounded Context를 서비스 단위로 정립하고 Aggregate 중심 설계를 적용하는 것이 매우 효과적이다.
참고 문헌
- Domain-Driven Design: Tackling Complexity in the Heart of Software – Eric Evans
- Implementing Domain-Driven Design – Vaughn Vernon
- Domain-Driven Design Distilled – Vaughn Vernon
반응형
'정보관리기술사 > SW공학' 카테고리의 다른 글
| ITSM(Information Technology Service Management) (0) | 2026.03.03 |
|---|---|
| 코드 스멜(Code Smell)과 리팩토링(Refactoring) (0) | 2026.03.03 |
| CMMI (Capability Maturity Model Integration) (0) | 2026.03.03 |
| ISO/IEC 12207 (Software Life Cycle Processes) (0) | 2026.02.26 |
| SLM(Service Level Management) (0) | 2026.02.25 |