

(1) Presentation Layer(표현 계층) (Controller)
- 사용자 요청에 대해 해석하고 응답하는 계층
- 사용자에게 UI를 제공하거나 클라이언트에 응답을 보내는 역할을 하는 모든 클래스가 포함됨
- Client로부터 request를 받고 response를 return하는 API 정의
(2) Application Layer(응용 계층) (Service)
- 비즈니스 로직을 정의하고 정상적으로 수행될 수 있도록 Domain 계층과 Infrastructure 계층을 연결
- 해당 계층은 많은 정보를 가지고 있지 않게 유지하는 것이 중요
- 실질적인 데이터의 상태 변화 등의 처리는 도메인 계층에서 진행할 수 있도록 위임하는 것이 중요
- 트랜잭션의 단위, DTO 변환, 엔티티 조회/저장이 해당 Layer에 포함됨
- 현재 로그인한 사용자가 특정 URL에 대해 권한에 따른 인가는 Presentation Layer에서 하지만, DB내의 데이터와 대조해봐야 알 수 있는 경우 해당 계층에서 진행
(3) Domain Layer(도메인 계층) (Model)
- 비즈니스 규칙, 정보에 대한 실질적인 도메인에 대한 정보를 가지고 있으며 이 모든 것을 책임지는 계층
- Entity를 활용하여 도메인 로직이 실행되며, 업무 상황을 반영하여 상태를 제어하는 역할에 집중하는 계층
(4) Infrasturcture Layer(인프라 계층) (Repository)
- 외부와의 통신(DB, 메시징 시스템 등)을 담당하는 계층
- 해당 계층에서 얻어온 정보를 응용 계층 또는 도메인 계층에 전달하는 것이 주 역할이다.
애그리거트에는 반드시 하나의 루트 애그리거트가 존재하고 루트 애그리거트는 하위 애그리거트들을 관리하는데 그럼 루트 애그리거트와 하위 애그리거트를 어떻게 구현할 수 있을까??
=> JPARepository를 루트 애그리거트에만 구현하는 것으로 가능합니다.
이렇게 하면 루트 애그리거트가 하위 애그리거트들을 관리하고 영속성 관련 로직도 루트 애그리거트에 집중할 수 있습니다.
예를 들어, 현재 Order <-> OrderProduct <-> Product의 구조로 OrderProduct와 Order, Product간의 1:N관계로 연관 매핑이 되어 있고 제품의 가격 정보를 수정하고 싶을때
Order(루트 애그리거트) -> OrderProduct(하위 애그리거트) -> Receipt(하위 애그리거트)를 호출하여 값을 수정할 수 있다.
복잡한 비즈니스 로직이나 모놀리식 애플리케이션을 MSA로 전환할 때, 가장 중요한 것은 서비스의 경계를 명확히 나누는 것입니다. 예를 들어, 모놀리식 이커머스 플랫폼을 MSA로 전환할 때는 주문, 상품, 리뷰와 같은 도메인 개념을 기준으로 마이크로서비스를 구축하게 됩니다.
DDD는 도메인 모델을 중심으로 비즈니스 로직을 정의하고, 이를 독립적인 도메인 경계로 나눕니다. 따라서 MSA와 DDD를 함께 사용하면, 도메인 경계를 기반으로 각 도메인에 해당하는 마이크로서비스를 정의할 수 있습니다. 이렇게 하면 각 마이크로서비스는 단일 책임 원칙을 따르고, 특정 비즈니스 기능에 집중할 수 있게 됩니다.