처음 프로젝트를 시작할 당시, 도메인 주도 설계(DDD)의 개념에 영향을 받아 설계를 시작했습니다. 도메인 간의 직접적인 연관관계 매핑을 피하고, 모든 연관 객체는 ID 값을 통해 직접 조회하는 방식으로 설계했습니다. 이는 도메인 간의 결합도를 낮추고, 각 도메인을 독립적으로 구성하려는 의도였습니다.
또한, DDD의 장점 중 하나인 도메인 설계 중심의 유즈케이스 구성, 그리고 서비스 레이어의 단순화, 테스트의 용이성 등을 기대하며 구조를 구성했습니다.
하지만 프로젝트가 점점 구체화되면서 다음과 같은 문제점이 발생했습니다.
| 시도 | 설명 | 장단점 |
|---|---|---|
| 1. 연관관계 매핑 도입 (JPA 방식 복귀) | @ManyToOne, @OneToMany 등 매핑을 도입 | ✅ 코드 간결, 쿼리 명확 / ❌ 연관 도메인 변경 시 영향 ↑ |
| 2. DDD와 연관 매핑의 절충안 | 도메인 내부는 ID 기반 유지하되 조회 시 DTO 혹은 서비스에서 join 처리 | ✅ 설계 유연성 확보 / ❌ 설계 복잡도는 여전 |
| 3. Aggregates 중심 구조 재정비 | 복잡한 도메인은 루트 기준으로 묶어 설계, 단순한 도메인은 연관 매핑 | ✅ 유연한 설계 가능 / ❌ 설계 기준을 일관되게 가져가기 어려움 |
| 4. Context 별 DB 접근 분리 | Bounded Context 별 Repository를 구분 → 진짜 독립된 도메인 설계 | ✅ 대규모 시스템 적합 / ❌ 작은 시스템엔 과함 |
DDD (Domain-Driven Design) 은 "도메인 모델을 중심으로 비즈니스 로직을 설계"하고자 하는 접근입니다. 핵심 개념은 다음과 같습니다:
이 개념은 복잡한 비즈니스 로직, 협업이 많은 대규모 시스템, 기능별 분리가 명확한 프로젝트에서 강력한 설계 도구가 됩니다.
하지만 현실적인 문제는 다음과 같습니다:
다음은 실제 프로젝트 환경에서 고려해야 할 설계 기준입니다:
| 조건 | 적절한 설계/기술 |
|---|---|
| 복잡한 비즈니스 도메인, 팀 규모 큼 | ✅ DDD (Bounded Context, Aggregate Root 중심) |
| 단일인 개발, 기능 적음 | ✅ JPA 기본 설계, 연관관계 매핑 적극 활용 |
| 명확한 계층 설계 원함 | ✅ Service/Repository 기반 레이어 구조 |
| 도메인보다 데이터 흐름이 중심 | ✅ Transaction Script 패턴도 고려 가능 |
설계는 목적에 종속된다.
도메인 주도 설계는 강력한 설계 도구이지만, 프로젝트의 성격, 팀 규모, 비즈니스 복잡도에 따라 그 활용 방식은 달라져야 합니다.
이번 프로젝트를 통해 얻은 교훈은 다음과 같습니다:
“DDD는 모든 프로젝트에 적합하지 않다.
설계는 문제를 해결해야 하며, 불필요한 복잡함을 가져와선 안 된다.”
결국 가장 중요한 것은, 문제를 해결할 수 있는 가장 단순하고 명확한 구조를 선택하는 것입니다.
설계보다 중요한 건 지속 가능한 개발입니다.