Aarchitecture/Domain Driven Design

Layered Archiecture

훈지런 2023. 1. 25. 18:15

레이어 분리


각 관심가 별로 4개의 레이어로 분리

 

  • 표현계층
  • 응용계층
  • 도메인계층
  • 인프라스트럭처

표현계층


사용자가 시스템을 사용할 수 있는 화면이나 흐름을 제어한다.
사용자의 요청을 알맞은 응용서비스에 전달하고 결과를 사용자에게 제공한다.
최범균 님의 도메인주고개발 시작하기 에서 말하길 꼭 응용서비스를 거쳐야 할 필요는 없고 단순 조회만의 기능 같은 건 표현계층에서 바로 DAO나 리포지토리에 붙는 것도 좋다고 함.
세션을 관리한다.
여기서 사용자는 사람뿐 아니라 외부 시스템일 수 있다.

응용계층


사용자가 요청한 기능을 실행한다.
업무로직을 직접 구현하지 않으며 도메인 계층을 조합해서 기능을 실행한다.
주로 도메인 객체 간의 흐름을 제어하는 형태를 갖는다.
도메인 로직을 응용서비스에 넣게 되면 응집성이 떨어지고, 응용서비스에서 동일한 도메인 로직이 중복될 가능성이 커진다.

도메인 계층


시스템이 제공할 도메인 규칙을 구현한다.
즉 애그리거트를 이용하겠다는 건데, 애그리거트만으로 해결할 수 없는 경우가 많다.

 

예를 들면, 주문 애그리거트와 할인 애그리거트가 있을 때 실제 주문금액계산은 어디서 해야 할지가 고민된다.
주문 애그리거트에서 할인 애그리거트를 불러와서 실제 금액계산 로직을 구현한다면 단일책임원칙(SRP)을 잘 지키지 못한 모양이 된다.

따라서 실제 주문금액 계산하는 서비스를 따로 뽑아 만들어 사용할 수 있는데 이걸 도메인 서비스라고 부른다.

도메인 서비스를 사용하는 주체는 응용서비스가 될 수도 있고 애그리 거트가 될 수도 있다.

주의해야 할 점은, 도메인 서비스를 애그리거트에 주입해서 사용하면 안 된다. 본능적으로 주입해서 사용하는 경우가 있는데 애그리거트의 필드는 모델의 중요한 구성요소이기 때문에 주입하지 말고 도메인 서비스를 변수로 전달받아 사용하길 권장한다.

또 최범균 님의 책에서 하나의 팁을 줬는데 도메인 서비스인지 응용서비스인지 감잡기 어려울 때는 해당기능이 애그리거트 상태를 변경하거나 상태값을 계산하는 기능이면 도메인서비스라고 생각하면 쉽다고 한다.

인프라 스트럭처


데이터 베이스나 메시징 시스템 같은 외부 시스템과의 연동을 처리한다.
RDBMS연동이나 메시징큐에 메시지 전송, 수신하는 기능, SMTP를 이용한 메일발송, rest api 호출 등등의 기술을 구현하는 부분.

'Aarchitecture > Domain Driven Design' 카테고리의 다른 글

비동기 이벤트  (0) 2023.01.27
이벤트  (0) 2023.01.26
애그리거트  (0) 2022.12.29
바운디드 컨텍스트  (0) 2022.12.21
도메인 주도 설계란?  (0) 2022.12.20