본문 바로가기
개발관련

DDD란?

by 수바니 2024. 9. 6.

DDD( Domain Driven Design )란?

도메인 주도 설계란?

도메인 패턴을 중심에 놓고 설계하는 패턴이다.

즉, 도메인 간의 상호작용이 설계의 중심이 된다. 도메인이란, 소프트웨어로 해결하고자 하는 문제의 영역, 실세계에서 사건이 발생하는 집합과 같은 말들로 정의할 수 있다.

 

여기서 '도메인'이란 소프트웨어로 해결하려는 문제의 영역을 의미합니다. 예를 들어 회원, 상품, 주문 등이 도메인이 될 수 있습니다.
또한, 하나의 도메인 내부에는 하위 도메인이 존재할 수 있습니다. (예: 회원 프로필, 상품 상세, 주문 상품 등)

 

 

 

DDD(Domain-Driven Design)와 계층형 아키텍처를 혼합한 형태

1. 디렉토리 구조 설명

  • application: 비즈니스 로직을 포함한 애플리케이션 서비스 계층입니다. 주로 유즈케이스(Use Case)에 따라 동작하며, 외부 입력과 도메인 계층 간의 연결을 담당합니다.
    • service: OrderService.java는 애플리케이션 서비스 계층에 속합니다. 이 서비스는 비즈니스 로직을 처리하며, 외부 요청을 받아 도메인 계층을 호출하거나 DTO를 통해 데이터를 조작합니다.
    • dto: OrderDTO.java는 Data Transfer Object로, 데이터 전송을 목적으로 사용됩니다. 주로 서비스 계층과 외부 인터페이스 간의 데이터 교환을 위해 사용됩니다.
  • domain: 도메인 계층으로, 핵심 비즈니스 로직과 규칙을 정의합니다.
    • model: Order.java, Product.java, ValueObject.java는 도메인 모델을 나타냅니다. 이들은 시스템 내에서의 핵심 개념과 엔티티(Entity), 값 객체(Value Object)를 정의합니다.
    • repository: OrderRepository.java는 도메인 레벨에서 데이터 저장소와의 상호작용을 추상화한 인터페이스입니다. 도메인 객체의 생명 주기 관리를 담당합니다.
    • service: OrderDomainService.java는 도메인 서비스로, 도메인 모델 자체에 정의되지 않은 복잡한 비즈니스 규칙이나 로직을 처리합니다. 예를 들어, 여러 도메인 엔티티 간의 협력이 필요할 때 사용됩니다.
  • infrastructure: 인프라스트럭처 계층으로, 외부 시스템과의 통신이나 데이터베이스 연동을 담당합니다.
    • repository: JpaOrderRepository.java, OrderRepositoryImpl.java는 데이터베이스와의 구체적인 상호작용을 담당합니다. 도메인 계층의 OrderRepository.java 인터페이스를 구현한 클래스입니다.
    • configuration: DatabaseConfig.java는 데이터베이스 설정 및 연결을 관리합니다.
    • messaging: KafkaMessageProducer.java는 메시징 시스템(Kafka)과의 통신을 처리합니다.
  • presentation: 프레젠테이션 계층으로, 사용자 인터페이스와의 상호작용을 담당합니다.
    • controller: OrderController.java는 웹 요청을 처리하고, 요청 데이터를 서비스 계층에 전달하며, 응답을 생성하는 역할을 합니다.
    • request: OrderRequest.java는 클라이언트로부터 전달받은 데이터를 캡슐화한 객체로, 주로 HTTP 요청 본문을 매핑합니다.

2. OrderService와 OrderDomainService의 차이

  • OrderService (애플리케이션 서비스):
    • OrderService.java는 주로 유즈케이스 관점에서 동작합니다. 이 계층에서는 주로 클라이언트(Controller)에서 받은 데이터를 바탕으로 필요한 도메인 객체를 사용하거나 조합하여 비즈니스 로직을 실행하고, 도메인 계층과 상호작용합니다.
    • 서비스 계층은 도메인 모델을 변경하는 로직이나 다른 애플리케이션 계층(메시지 큐, 데이터베이스 등)과의 상호작용을 처리합니다. 예를 들어, 주문 생성 요청이 들어오면 해당 요청을 검증한 후 도메인 모델을 이용하여 실제 주문을 생성하고, 필요한 경우 다른 서비스를 호출할 수 있습니다.
  • OrderDomainService (도메인 서비스):
    • OrderDomainService.java는 순수하게 도메인 계층 내에서 복잡한 비즈니스 규칙을 처리하는 클래스입니다. 도메인 엔티티(Order, Product)나 값 객체(ValueObject) 간의 협력을 필요로 하는 비즈니스 로직이 여기에 정의됩니다.
    • 예를 들어, 주문의 총액 계산이나 재고 검증 등 여러 도메인 객체에 걸친 로직이 필요할 때 이 서비스가 사용됩니다.
    • 이 서비스는 주로 도메인 모델에 집중하며, 외부 시스템이나 애플리케이션 서비스와의 직접적인 상호작용은 하지 않습니다.

정리

  • OrderService애플리케이션 계층에 속하며, 주로 클라이언트 요청을 처리하고, 도메인 계층과 통신합니다. 외부와 도메인 간의 다리 역할을 합니다.
  • OrderDomainService도메인 계층에서 복잡한 비즈니스 로직을 담당하며, 여러 도메인 객체 간의 상호작용이 필요할 때 사용됩니다. 도메인 규칙을 구현하고 도메인 모델과 직접적으로 관련된 작업을 처리합니다.