7. 도메인 서비스
여러 애그리거트가 필요한 기능
도메인 영역의 코드를 작성하다 보면 한 애그리거트로 기능을 구현할 수 없을 때가 있다. 이럴 때 한 애그리거트에 넣기에 애매한 기능을 특정 애그리거트에서 억지로 구현하면 안 된다. 이 경우 다음과 같은 문제점이 발생한다.
애그리거트가 자신의 책임 범위를 넘어서는 기능을 구현하므로 코드가 길어지고 외부의 의존이 높아짐.
코드를 복잡하게 만들어 수정을 어렵게 만드는 요인이 된다.
애그리거트의 범위를 넘어서는 도메인 개념이 애그리거트에 숨어들어서 명시적으로 드러나지 않게 된다.
이런 문제를 해소하기 위해 도메인 서비스를 별도로 구현한다.
도메인 서비스
한 애그리거트에 넣기 애매한 도메인 개념을 구현하려면 애그리거트에 억지로 넣기보다는 도메인 서비스
를 이용해서 도메인 개념을 명식적으로 드러내면 된다. 응용 영역의 서비스가 응용 로직을 다룬다면 도메인 서비스는 도메인 로직을 다룬다.
도메인 서비스가 도메인 영역의 다른 구성요소(애그리거트, 밸류)와 다른 점은 상태 없이 로직만 구현한다는 것이다. 상태는 애그리거트나 다른 방법으로 전달받는다.
사용 주체
도메인 서비스를 사용하는 주체는 애그리거트가 될 수도 있고 응용 서비스가 될 수도 있다. 사용 주체가 애그리거트인 경우 애그리거트 객체에 도메인 서비스를 전달하는 것은 응용 서비스 책임이다. 이와 같이 애그리거트 메서드를 실행할 떄 도메인 서비스를 실행하지 않고 반대로 도메인 서비스의 기능을 실행할 때 애그리거트를 전달하기도 한다.
도메인 서비스를 애그리거트에 주입하지 않기
애그리거트의 메서드를 실행할 때 도메인 서비스 객체를 파라미터로 전달한다는 것은 애그리거트가 도메인 서비스에 의존한다는 것을 뜻한다. 하지만 도메인 객체는 필드로 구성된 데이터와 메서드를 이용해서 개념적으로 하나인 모델을 표현한다. 도메인 서비스는 데이터 자체와는 관련이 없으며 일부 기능만 필요로 하므로 굳이 도메인 서비스 객체를 애그리거트에 의존 주입할 이유는 없다.
도메인 서비스의 패키지 위치
도메인 서비스는 도메인 로직을 실행하므로 도메인 서비스의 위치는 다른 도메인 구성 요소와 동일한 패키지에 위치한다. 도메인 서비스의 개수가 많거나 명시적으로 분리하고 싶은 경우 domain.service
같이 하위 패키지를 구분시켜 위치시킨다.
도메인 서비스의 인터페이스와 클래스
도메인 서비스의 로직이 고정되어 있지 않은 경우 도메인 서비스 자체를 인터페이스로 구현하고 이를 구현한 클래스를 둘 수도 있다. 도메인 서비스의 구현이 특정 구현 기술에 의존적이거나 외부 시스템의 API를 실행한다면 도메인 영역의 도메인 서비스는 인터페이스로 추상화 해야 한다.
Last updated
Was this helpful?