고딩왕 코범석

7장 - 도메인 서비스 본문

Book Lounge/도메인 주도 개발 시작하기

7장 - 도메인 서비스

고딩왕 코범석 2022. 7. 16. 21:09
반응형

Index

  1. 여러 애그리거트가 필요한 기능
  2. 도메인 서비스
    1. 계산 로직과 도메인 서비스
    2. 외부 시스템 연동과 도메인 서비스
    3. 도메인 서비스의 패키지 위치
    4. 도메인 서비스의 인터페이스와 클래스

여러 애그리거트가 필요한 기능

  • 여러 애그리거트가 필요한 기능이 있을 때 특정 도메인에 로직을 몰아넣게 되면 다음과 같은 문제점이 발생한다.
    1. 코드가 길어지고 외부 의존도가 높아진다.
    2. 애그리거트의 범위를 넘어서는 도메인 개념이 애그리거트에 숨어 명시적으로 드러나지 않는다.
  • 이 경우 도메인 기능을 별도의 서비스로 구현하는 방법이 있다.

위로

도메인 서비스

  • 도메인 서비스는 도메인 영역에 위치한 도메인 로직을 표현할 때 사용한다. 주로 다음과 같은 상황에 사용한다.
    1. 계산 로직 : 여러 애그리거트가 필요한 계산 로직이거나 한 애그리거트에 넣기는 다소 복잡한 계산 로직
    2. 외부 시스템 연동이 필요한 도메인 로직 : 구현하기 위해 타 시스템을 사용해야하는 도메인 로직

계산 로직과 도메인 서비스

  • 도메인 서비스를 별도로 구현해 도메인 개념을 명시적으로 드러내면 된다.
  • 응용 서비스는 응용 로직을 다룬다면 도메인 서비스는 도메인 로직을 다루는 서비스라 이해하면 된다.
    • 응용 서비스는 애그리거트 객체에 도메인 서비스를 전달한다.
  • 도메인 서비스는 도메인 로직을 처리하지 응용 로직을 처리하지 않는다.
    • 트랜잭션 처리는 응용 서비스 책임이므로 별도로 구현하지 않는다.

외부 시스템 연동과 도메인 서비스

  • 외부 시스템이나 타 도메인과의 연동 기능도 도메인 서비스가 될 수 있다.
    • 외부 시스템의 경우 HTTP API 호출로 이뤄지지만 필요한 외부 시스템에 대한 로직도 하나의 도메인 로직으로 볼 수 있기 때문이다.
  • 외부 시스템 호출 시 HTTP 외에 다른 방법으로도 호출할 수 있기 때문에 인터페이스를 만들고 구현체를 인프라스트럭쳐 영역에 위치시킨다.

도메인 서비스의 패키지 위치

  • 도메인 서비스는 도메인 로직을 표현하므로 도메인이 위치한 패키지에 같이 위치시킨다.
  • 도메인 서비스의 개수가 많거나 엔티티, 밸류와 같은 다른 구성요소들과 명시적으로 구분하고 싶다면 domain 패키지 밑에 domain.model, domain.service, domain.repository와 같이 하위 패키지를 구분해도 좋다.
https://user-images.githubusercontent.com/37062337/179353130-b9754736-6b65-435d-b2b6-08a42e5da767.png

도메인 서비스의 인터페이스와 클래스

  • 도메인 서비스의 로직이 고정되어 있지 않은 경우 인터페이스로 추출할 수 있다.
  • 즉, 도메인 서비스의 구현이 특정 기술에 의존하거나 외부 시스템 API를 실행한다면 도메인 영역의 도메인 서비스는 인터페이스로 추상화해야한다.
  • 이를 통해 도메인 영역이 특정 구현에 종속되는 것을 막고 도메인 영역에 대한 테스트가 쉬워진다.

위로

반응형