Skip to main content

7. 도메인 서비스

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

  • 도메인 영역의 코드를 작성하다 보면 한 애그리거트로 기능을 구현하 수 없을 때가 있습니다.
  • 이 때 한 애그리거트에 넣기에 애매한 도메인 기능을 특정 애그리거트에서 억지로 구현하면 안됩니다.
    • 이 경우, 애그리거트는 자신의 책임 범위를 넘어서는 기능을 구현하기 때문에 코드가 길어지고 외부에 대한 의존이 높아지게 됩니다.
    • 결국, 코드를 복잡하게 만들어 수정을 어렵게 만드는 요인이 됩니다.
  • 이를 해결하는 가장 쉬운 방법은 도메인 서비스를 별도로 구현하는 것입니다.

도메인 서비스#

  • 할인 금액 규칙 계산처럼 한 애그리거트에 넣기 애매한 도메인 개념을 구현하려면 애그리거트에 억지로 넣기보다는 도메인 서비스를 이용해서 도메인 개념을 명시적으로 드러내면 됩니다.
  • 응용 영역의 서비스가 응용 로직을 다룬다면 도메인 서비스는 도메인 로직을 다룹니다.
  • 도메인 서비스가 도메인 영역의 애그리거트나 밸류와 같은 다른 구성요소와 비교할 때 다른점은 상태 없이 로직만 구현한다는 점입니다.
  • 애그리거트 객체에 도메인 서비스를 전달하는 것은 응용 서비스 책임입니다.

도메인 서비스 객체를 애그리거트에 주입하지 않기

  • 애그리거트의 메서드를 실행할 때 도메인 서비스 객체를 파라미터로 전달하다는 것은 애그리거트가 도메인 서비스에 의존한다는 것을 뜻합니다.
  • 도메인 객체는 필드(프로퍼티)로 구성된 데이터와 메서드를 이용한 기능을 이용해서 개념적으로 하나인 모델을 표현합니다. 모델의 데이터를 담는 필드는 모델에서 중요한 구성요소입니다.
  • 애그리거트 메서드를 실행할 때 도메인 서비스를 인자로 전달하지 않고 반대로 도메인 서비스의 기능을 실행할 때 애그리거트를 전달하기도 합니다.
  • 도메인 서비스는 도메인 로직을 수행하지 응용 로직을 수행하지 않습니다.

특정 기능이 응용 서비스인지 도메인 서비스인지 감을 잡기 어려울 때는 해당 로직이 애그리거트의 상태를 변경하거나 애그리거트의 상태 값을 계산하는지 검사해보면 됩니다.

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

  • 도메인 서비스는 도메인 로직을 실행하므로 도메인 서비스의 위치는 다른 도메인 구성 요소와 동일 한 패키지에 위치합니다.
  • 도메인 서비스의 개수가 많거나 엔티티나 밸류와 같은 다른 구성요소와 명시적으로 구분하고 싶다면 domain 패키지 밑에 하위 패키지를 구분하는 것도 방법입니다.

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

  • 도메인 서비스의 로직이 고정되어 있지 않은 경우 도메인 서비스 자체를 인터페이스로 구현하고 이를 구현한 클래스를 둘 수도 있습니다.
  • 특히 도메인 로직을 외부 시스템이나 별도 엔진을 이용해서 구현해야 할 경우에 인터페이스와 클래스를 분리하게 됩니다.
  • 도메인 서비스의 구현이 특정 기술에 종속되면 인터페이스와 구현 클래스로 분리합니다.
    • 이를 통해 도메인 영역이 특정 구현에 종속되는 것을 방지할 수 있고 도메인 영역에 대한 테스트가 수월해집니다.
Last updated on