나미/IT 지식

도메인 주도 설계란? (Domain Driven Design)

규남 2025. 7. 8. 13:54
반응형

✅ 도메인 주도 설계(DDD)란 무엇인가요?

도메인 주도 설계(Domain-Driven Design, 이하 DDD)는 복잡한 소프트웨어를 효과적으로 설계하고 개발하기 위한 접근 방식입니다. 특히 비즈니스 로직이 복잡한 시스템에서 매우 유용하게 사용됩니다.

DDD는 단순한 설계 방법론이 아니라, 비즈니스 중심의 개발 철학이자 모델링 전략입니다.

📌 도메인(Domain)이란?

도메인이란, 소프트웨어가 해결하고자 하는 특정 문제 영역을 의미합니다.

예를 들어,

  • 쇼핑몰 서비스에서는 “주문”, “상품”, “결제” 등이 도메인입니다.
  • 병원 시스템에서는 “진료”, “환자”, “예약” 등이 도메인입니다.

즉, 비즈니스의 핵심 개념들이 바로 도메인입니다.

📌 도메인 주도 설계는 왜 필요할까요?

🚫 문제점 예시

많은 프로젝트에서 이런 일이 벌어지곤 합니다:

  • 개발자는 기술 중심으로 코드를 짬
  • 기획자나 비즈니스 담당자는 별도로 문서를 작성함
  • 서로 소통이 잘 안 돼서, 현실과 코드가 따로 놈

👉 그 결과?
코드는 복잡해지고, 수정이 어렵고, 개발자는 자주 “이 코드 왜 이렇게 됐지…?” 하게 됩니다.

✅ 해결책: DDD

DDD는 다음을 목표로 합니다:

  • 비즈니스 용어와 코드가 일치
  • 도메인 전문가(기획자, 현업)와 개발자의 협업
  • 비즈니스 로직이 잘 표현된 설계

🧩 DDD의 핵심 개념

1. 유비쿼터스 언어 (Ubiquitous Language)

개발자와 도메인 전문가가 공통으로 사용하는 용어 체계

예: “결제 승인”, “주문 취소”, “배송 상태” 등
→ 코드, 문서, 회의에서 이 용어들을 그대로 사용

2. 엔터티(Entity) & 값 객체(Value Object)

  • Entity: 고유한 ID를 가지는 객체 (예: 사용자, 주문)
  • Value Object: 값으로 구분되는 객체 (예: 주소, 전화번호)

3. 애그리거트(Aggregate)

여러 Entity/Value Object를 하나의 일관된 단위로 묶은 것

예: 주문 애그리거트 → 주문정보 + 주문상품 목록 + 결제상태 등
→ 변경은 항상 애그리거트 단위로 이뤄짐

4. 리포지토리(Repository)

Entity를 저장하고 꺼내오는 저장소 역할의 인터페이스

예: OrderRepository.findById(orderId)

5. 도메인 서비스(Domain Service)

여러 엔터티에 걸친 비즈니스 로직을 담는 객체

예: 포인트로 결제 가능한지 확인하는 서비스

🧪 예시: 쇼핑몰 주문

public class Order {
    private OrderId id;
    private List<OrderItem> items;
    private OrderStatus status;

    public void cancel() {
        if (status == OrderStatus.SHIPPED) {
            throw new IllegalStateException("이미 배송된 주문은 취소할 수 없습니다.");
        }
        this.status = OrderStatus.CANCELLED;
    }
}

Order, OrderItem, OrderStatus는 도메인 모델이며, cancel()은 비즈니스 규칙을 도메인 안에 담은 예시입니다.

🧠 DDD는 언제 쓰면 좋을까요?

✔ 적합한 경우

  • 복잡한 비즈니스 로직이 있는 시스템
  • 장기적으로 유지보수가 중요한 프로젝트
  • 도메인 전문가와 협업이 중요한 프로젝트

❌ 적합하지 않은 경우

  • 단순한 CRUD 위주의 서비스
  • 빠른 MVP가 필요한 상황

✅ 마무리

도메인 주도 설계는 단순한 기술 스택이 아니라, 비즈니스를 잘 이해하고 모델링하는 방법입니다.
처음에는 다소 어렵게 느껴질 수 있지만, 도메인 중심의 사고방식이 익숙해지면 더 견고하고 확장 가능한 시스템을 만들 수 있습니다.

728x90
반응형