최범균 님의 "도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지" 책을 정리한 포스팅 입니다.
1. 도메인이란?
소프트웨어로 해결하고자 하는 문제의 영역
- 여러 하위 도메인으로 구성될 수 있음
- 외부 서비스로 대체될 수 있음 (ex. 배송 - 택배사 시스템)
예) 온라인 서점
더보기
- 주문: 정산, 배송, 결제, 회원, 혜택(->할인,쿠폰), 카탈로그(-> 리뷰)
- 조회
2. 도메인 전문가와 개발자 간 지식 공유
도메인 별 전문가들은 각 도메인 시스템에게 원하는 요구사항이 있음
개발자는 이런 요구사항을 분석하고 설계하여 개발함
- 요구사항을 올바르게 이해하는것이 첫번째 단계 (가장 중요)
- ➡️ 직접 전문가와 개발자가 대화하는것이 가장 효과적
예시) 온라인 쇼핑몰
더보기
주문
- 상품 선택
- 배송지 입력
- 결제 (결제 수단 선택)
- option) 주문 후, 배송지 주소 변경 (단, 배송 상태: '배송 전'일 경우)
3. 도메인 모델
- 특정 도메인을 개념적으로 표현한 모델
항목 | 내용 |
목적 |
- 도메인을 동일한 방식으로 이해하기 위함
- 도메인의 지식을 공유하기 위함 |
고려 사항 | 구현 모델이 개념 모델을 최대한 따르도록 설계 하기 |
표현 방법 (UML) |
- 클래스 다이어그램: 시스템의 단위를 클래스 단위로 표현
- 상태 다이어그램: 하나의 객체가 가지는 상태 변화를 시각적으로 표현 |
4. 도메인 모델 패턴
Layered Architecture
- 일반적인 애플리케이션 아키텍처
계층 (Layer) | 설명 | 역할 및 특징 |
Presentation |
인터페이스 계층 (UI, API 등)
|
사용자 요청 처리
|
Application | 유스케이스 실행 |
도메인 계층 조합 및 활용함
|
Domain | 핵심 비즈니스 로직 담당 | 도메인 개념 기반 |
Infrastructure | 외부 시스템 연동 (데이터베이스, 메시지 브로커, 외부 API 등) |
기술적 세부사항이 명시됨
|
5. 도메인 모델 도출
개념 모델 도출
- 현실 세계의 구조를 모델링
활동 | 설명 | 산출물 |
1. 요구사항 분석 | 도메인 이해 (기획서/유스케이스/스토리/이해관계자와의 인터뷰) | 도메인 이해도, 문제 정의 |
2. 핵심 구성요소 도출 | Entity, Value Object, Role 식별 | 초기 도메인 구성요소 목록 |
3. 도메인 규칙 정리 | 업무 규칙 및 제약조건 정리 | 도메인 규칙 목록 |
4. 도메인 기능 식별 | 사용자/시스템 행동에 따른 기능 도출 | 유스케이스 기반 기능 목록 |
5. 도메인 모델 초안 작성 | 클래스 간 관계, 속성, 역할 관계 매핑 | 도메인 클래스 다이어그램 (초안) |
구현 모델 도출
- 시스템에 구현하도록 모델 도출
활동 | 설명 | 산출물 |
1. 도메인 메서드 정의 | 기능 목록을 기반으로 도메인 클래스에 메서드 추가 | 엔티티 및 VO의 메서드 정의 |
2. 연관 관계 구체화 | 연관 관계 방향, 집합성, 불변성 정의 | 명세된 관계 (UML 등) |
3. 트랜잭션 범위 설계 | 업무 단위별 원자성 보장 범위 설계 | 서비스 단위 정의 |
4. 구현 가능 모델 확정 | 시스템 구현을 위한 최종 도메인 구조 설계 | 구현 도메인 모델, ERD 기초 |
6. 엔티티와 밸류
항목 | 엔티티 (Entity) | 밸류 타입 (Value Object) |
정의 | 고유한 식별자를 가진 도메인 객체 | 개념적으로 하나의 값을 표현하는 객체 |
식별성 | ✅ – ID로 식별 | ❌ – 값 자체로 동일성 판단 |
ID 생성 방식 | - UUID, Nano ID - 현재 시간 + 기타 값 조합 - DB 시퀀스 |
❌ |
불변성 여부 | ❌ (상태 변경 메서드 열려있음) | ✅ (한 번 생성된 후 상태 변경하지 않음) |
캡슐화 | 필드 보호를 위해 캡슐화 필요 | 필드 내부 값도 최대한 캡슐화 |
설계 시 주의사항 | 상태 변경 메서드 명시적 정의 (set 메서드 사용 지양) | - 값의 의미 단위로 분리 - 불변 객체로 설계 |
용도 | 개별 존재로 추적해야 하는 경우 | 의미 있는 속성 묶음을 하나의 값으로 표현할 때 |
예시 | 주문(Order), 사용자(User), 상품(Product) | 주소(Address), 이름(Name), 금액(Money) |
7. 도메인 용어와 유비쿼터스 언어
유비쿼터스 언어
- 전문가, 관계자, 개발자가 도메인과 관련된 공통의 언어를 쓰는 것 (문서, 도메인 모델, 코드 등)
- 도메인 용어를 사용하여 가독성을 높이기 (분석 및 이해하는 과정을 줄일 수 있음)
'Code' 카테고리의 다른 글
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 12. 채팅 시스템 설계 (3) | 2025.08.03 |
---|---|
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 10. 알림 시스템 설계 (3) | 2025.08.02 |
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 6. 키-값 저장소 설계 (3) | 2025.08.02 |
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 2. 개략적인 규모 추정 (3) | 2025.08.01 |
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 1. 사용자 수에 따른 규모 확장성 (2) | 2025.07.31 |