Domain Service
What is Domain Service ?
When a significant process or transformation in the domain is not a natural responsibility of an ENTITY or VALUE OBJECT, add an operation to the model as standalone interface declared as a SERVICE. Define the interface in terms of the language of the model and make sure the operation name is part of the UBIQUITOUS LANGUAGE. Make the SERVICE stateless.
— Eric Evans Domain-Driven Design —
From: Domain Driven Design
도메인의 중대한 프로세스나 변환 과정이 ENTITY 나 VALUE OBJECT 의 고유한 책임이 아니라면 연산을 SERVICE 로 선언되는 독립 인터페이스 모델에 추가하라. 모델의 언어라는 측면에서 인터페이스를 정의하고 이름을 UBIQUITOUS LANGUAGE 의 일부가 되게끔 구성하라. SERVICE 는 상태를 갖지 않게 만들어라.
도메인 서비스간 의존 관계는 최대한 제거:
도메인 레이어에 속하는 도메인 서비스간의 의존 관계는 최대한 제거하는게 좋다.
Benefits
- 도메인 레이어에 대한 테스트 코드 작성이 쉽다.
- Layered Architecture 에서 Domain Layer 에 대한 테스트 코드 작성이 가장 중요하다고 생각한다.
- 도메인 서비스간에 상하 관계를 제거할 수 있다.
- 서비스간의 참조 관계를 두다 보면, Root Service 에 많은 의존성이 생겨서 테스트 코드 작성이 어려워질 수 있다. 또한, 도메인 로직 파악이 어려워진다.
Implementation
- 세세한 구현과, low-level 의 기술은 infrastructure 에 위임하고, 구현체를 사용하는 레이어에 interface 를 제공한다.
- 해당 레이어에서는 DIP(Dependency Inversion Principle, 의존 관계 역전 원칙)를 통해 구현체를 사용한다.
Dependency Inversion Principle
- 구현체가 아닌 추상화에 의존한다. (= 구현이 아닌 역할에 의존)
- 추상화 레벨이 높은 상위 수준의 모듈이 추상화 레벨이 낮은 하위 모듈에 의존하면 안된다.
- Domain Layer 가 상위 수준의 모듈, Infrastructure Layer 가 하위 수준의 모듈로 볼 수 있다.
DIP 를 적용했을때의 장점은 Portable Service Abstraction 의 장점과 같다.
서비스 추상화로 제공되는 기술을 다른 기술 스택으로 간편하게 바꿀 수 있는 확장성이 생긴다.
Naming
보통의 경우에는 application layer 에서 Facade 형식의 xxxService 라는 네이밍을 사용하는 컨벤션을 사용하곤 한다. 하지만 DDD 개념을 적용하여 개발하는 경우에는 다른 네이밍을 가져가는게 좋다고 생각한다.
- Ex. xxxFacade, xxxApplicationService …
Links
References
- 도메인 주도 설계 / Eric Evans 저 / 위키북스