도입
개발을 하다 보면 기능은 동작하지만, 시간이 지나면서 “어디에 어떤 규칙이 있는지” 찾기 어려워지는 순간이 옵니다.
컨트롤러/서비스에 조건문이 늘어나고, 요구사항 변경 때마다 여러 곳을 동시에 수정해야 한다면 설계의 중심이 도메인(업무 개념)에서 벗어났을 가능성이 큽니다.
“DDD의 목적은 기술 중심 설계를 도메인 중심 설계로 바꾸는 것입니다.
즉, 코드가 업무 규칙을 더 잘 설명하도록 만드는 것”입니다.
정의
여기서 핵심은 프레임워크가 아니라 모델(Model)입니다. DDD는 “계층 구조를 이렇게 나누세요”보다, “우리 서비스의 핵심 개념과 규칙은 무엇인가?”, “그 규칙을 어디에 두어야 변경에 강한가?”를 먼저 묻습니다.
💡 TIP / DDD는 “대규모 프로젝트 전용”이 아니다
작은 프로젝트에서도 도메인 규칙이 자주 바뀌거나 복잡도가 높다면 DDD 사고방식은 큰 도움이 됩니다. 다만 모든 패턴을 한 번에 도입하기보다 용어 정리 → 경계 설정 → 핵심 규칙 캡슐화 순서로 적용하는 것이 좋습니다.
왜 필요한가
DDD의 핵심 개념
1. 전략적 설계 (Strategic Design)
시스템 전체를 어떤 경계로 나눌지, 팀/서비스 간 책임을 어떻게 분리할지 결정하는 단계입니다. “어디까지가 같은 도메인인가?”를 정하는 관점이라고 보면 됩니다.
유비쿼터스 언어 (Ubiquitous Language)
개발자, 기획자, 도메인 전문가가 같은 단어를 같은 의미로 쓰는 약속입니다. 예를 들어 “주문 확정”, “결제 완료”, “배송 시작”의 의미가 사람마다 다르면 코드와 문서도 바로 어긋납니다.
경계 컨텍스트 (Bounded Context)
같은 단어라도 컨텍스트가 다르면 의미가 달라질 수 있습니다. 예를 들어 “고객”이 주문 컨텍스트에서는 배송/결제 중심이고, 마케팅 컨텍스트에서는 세그먼트/캠페인 중심일 수 있습니다. DDD는 이 차이를 인정하고 경계를 분리합니다.
2. 전술적 설계 (Tactical Design)
경계 안에서 실제 코드를 어떻게 구성할지에 대한 패턴입니다. 흔히 DDD를 처음 접할 때 가장 많이 보는 부분이지만, 전략적 설계 없이 패턴만 가져오면 효과가 줄어듭니다.
DDD 구성 예시
예시 시나리오: 주문 취소
“배송 시작 전까지만 주문 취소 가능”이라는 규칙이 있다고 가정해봅시다. 이 규칙을 컨트롤러 if문에 두면 다른 API(관리자/배치/이벤트 소비자)에서 빠질 수 있습니다. 따라서 Order Aggregate 내부의 행동으로 두는 것이 안전합니다.
구조 관점
- Controller: 요청/응답 처리
- Application Service: 주문 조회 → 취소 호출 → 저장(트랜잭션)
- Order Aggregate: 취소 가능 여부 검증 + 상태 변경
- Repository: 저장소 구현(JPA/MyBatis 등)
DDD와 레이어드 아키텍처
자주 하는 오해
BAD
- 도메인 규칙이 Controller/Service if문에 흩어짐
- Entity가 단순 getter/setter 데이터 구조체가 됨
- Repository가 쿼리 유틸처럼만 사용됨
- “DDD 적용”인데 팀 용어 정의는 없음
GOOD
- 핵심 규칙을 Aggregate 행동으로 캡슐화
- 유스케이스 흐름은 Application Service에서 조합
- 저장/외부 연동은 Infrastructure로 분리
- 도메인 용어를 문서/코드/회의에서 통일
언제 쓰면 좋은가
적합한 경우
- 결제/정산/주문/권한/정책처럼 규칙이 많은 도메인
- 기획 변경이 잦고 예외 케이스가 계속 늘어나는 서비스
- 팀 규모가 커져 용어 불일치 비용이 커지는 조직
과한 경우(주의)
- 단순 CRUD 중심의 관리 화면/백오피스 기능만 있는 경우
- 도메인 규칙보다 화면/리포트/조회 쿼리가 중심인 경우
- 팀이 DDD 용어/개념을 공유하지 않은 상태에서 패턴만 복붙하는 경우
실무 적용 순서
정리
✅ 핵심 요약
- ✔️ DDD의 핵심은 프레임워크가 아니라 도메인 모델입니다.
- ✔️ 전략적 설계는 경계(컨텍스트), 전술적 설계는 코드 패턴(엔티티/애그리거트 등)을 다룹니다.
- ✔️ 비즈니스 규칙은 Controller가 아니라 도메인에 두는 것이 변경에 강합니다.
- ✔️ DDD는 “한 번에 완성”이 아니라, 문제 많은 도메인부터 점진 적용하는 것이 현실적입니다.