도메인 주도 설계(DDD, Domain-Driven Design)는 복잡한 비즈니스 도메인을 효과적으로 모델링하고 개발하는 방법론으로, 소프트웨어 개발을 도메인 중심으로 진행하는 설계 방식입니다.
DDD는 비즈니스 로직을 중심으로 소프트웨어를 개발하며, 코드 구조가 도메인 개념을 반영하도록 설계됩니다.
도메인(Domain): 특정 비즈니스나 문제 영역
예를 들어, 전자상거래 시스템의 경우 다음과 같은 도메인을 가질 수 있습니다.
이러한 도메인은 각각 고유한 비즈니스 규칙과 로직을 가집니다. DDD는 이런 도메인을 중심으로 개발을 진행하는 방식입니다.
DDD는 여러 개념을 포함하며, 특히 아래 4가지 개념이 핵심입니다.
Order(주문), User(사용자), Product(상품)public class Order {
private Long id; // 고유 식별자
private List<OrderItem> items;
private OrderStatus status;
public void completeOrder() {
this.status = OrderStatus.COMPLETED;
}
}
Money(가격), Address(주소)public class Money {
private final BigDecimal amount;
public Money(BigDecimal amount) {
this.amount = amount;
}
public Money add(Money other) {
return new Money(this.amount.add(other.amount));
}
}
예: Order가 OrderItem을 포함하는 애그리게이트
public class Order {
private Long id;
private List<OrderItem> items = new ArrayList<>();
public void addItem(OrderItem item) {
items.add(item);
}
}
Order가 애그리게이트 루트OrderItem은 Order를 통해서만 접근 가능public interface OrderRepository {
Order findById(Long id);
void save(Order order);
}
이렇게 하면 비즈니스 로직을 DB 구현 방식과 분리할 수 있습니다.
✅ 비즈니스 로직을 명확하게 표현
✅ 도메인 개념이 코드에 반영되어 유지보수성이 향상
✅ 기능 변경 시 도메인 중심으로 확장 가능
✅ 객체지향적인 설계로 캡슐화 강화
⚠ 초기 개발 비용이 높을 수 있음
⚠ 단순한 프로젝트에서는 오히려 과한 설계가 될 수 있음
⚠ 도메인 전문가와의 협업이 중요함
도메인 주도 설계(DDD)는 비즈니스 도메인을 중심으로 소프트웨어를 개발하는 방법론으로, 엔티티, 밸류 객체, 애그리게이트, 리포지토리 등의 개념을 활용하여 유지보수성과 확장성을 높이는 데 중점을 둡니다.
단순한 프로젝트에서는 과한 설계가 될 수 있지만, 복잡한 도메인을 다루는 시스템에서는 강력한 장점을 제공합니다. 😊