개발공부/CS

DDD(Domain-Driven Design)란?

카슈밀 2025. 2. 16. 00:45
반응형

DDD(Domain-Driven Design)

  • 비즈니스 도메인을 중심으로 소프트웨어를 설계하는 방법론
  • 주요 개념:
    • 유비쿼터스 언어
    • 바운디드 컨텍스트
    • 애그리게이트
    • 도메인 이벤트
    • 엔티티와 값 객체


**핵심 개념과 원칙**

1. 전략적 설계 (Strategic Design)
- 바운디드 컨텍스트 (Bounded Context)
  - 특정 도메인 모델이 적용되는 명확한 경계
  - 예: '주문' 컨텍스트와 '배송' 컨텍스트는 서로 다른 규칙과 개념을 가짐

- 유비쿼터스 언어 (Ubiquitous Language)
  - 도메인 전문가와 개발자가 공유하는 공통 언어
  - 코드, 문서, 대화에서 일관되게 사용
  - 예: '주문'이라는 용어가 모든 맥락에서 동일한 의미를 가짐

2. 전술적 설계 (Tactical Design)
- 엔티티 (Entity)
  - 고유한 식별자를 가지는 객체
  - 예: 주문번호로 식별되는 주문

- 값 객체 (Value Object)
  - 식별자 없이 속성으로만 정의되는 객체
  - 불변성을 가짐
  - 예: 주소, 금액

- 애그리게이트 (Aggregate)
  - 연관된 객체들의 집합
  - 일관성을 보장하는 경계
  - 예: 주문(루트)과 주문항목들

```java
// 애그리게이트 예시
public class Order {  // 애그리게이트 루트
    private OrderId id;
    private List<OrderItem> items;
    private Money totalAmount;
    
    public void addItem(Product product, int quantity) {
        OrderItem item = new OrderItem(product, quantity);
        validateItemAddition(item);
        items.add(item);
        recalculateTotalAmount();
    }
}
```

3. 도메인 서비스 (Domain Service)
- 여러 애그리게이트에 걸친 비즈니스 로직
- 상태를 가지지 않음
- 예: 주문 가격 계산 서비스

4. 리포지토리 (Repository)
- 애그리게이트의 저장소
- 도메인 객체의 영속성 처리
- 예: OrderRepository

**적용 프로세스**

1. 도메인 전문가와의 협업
   - 도메인 지식 습득
   - 유비쿼터스 언어 정의
   - 주요 비즈니스 규칙 파악

2. 모델링
   - 바운디드 컨텍스트 식별
   - 애그리게이트 설계
   - 도메인 이벤트 정의

3. 구현
   - 도메인 모델을 코드로 표현
   - 비즈니스 규칙을 명시적으로 구현
   - 테스트 주도 개발 적용

**장점**
- 비즈니스 복잡성 효과적 관리
- 도메인 전문가와 개발자 간 원활한 소통
- 유지보수성 향상
- 비즈니스 규칙의 명확한 표현

**단점**
- 학습 곡선이 높음
- 초기 설계에 많은 시간 소요
- 단순한 CRUD 애플리케이션에는 과도할 수 있음
- 팀 전체의 이해와 합의 필요

DDD는 특히 복잡한 비즈니스 로직을 가진 시스템에서 효과적이며, 현대의 마이크로서비스 아키텍처와도 잘 어울립니다.

728x90

'개발공부 > CS' 카테고리의 다른 글

[자료구조] AVL 트리란?  (0) 2025.02.16
MSA(Microservices Architecture)란?  (0) 2025.02.16
쿠버네티스란?  (0) 2025.02.16
메시지 큐(Message Queue)  (0) 2025.02.16
프레임워크와 라이브러리의 차이점  (0) 2025.02.16