도메인 서비스의 역할과 특징 및 예시
도메인 서비스는 도메인 객체(값 객체/엔티티)에 미처 담지 못한 도메인 규칙을 표현하는 객체이다. 도메인 규칙의 예시로는 다음과 같은 것들이 있다.
- 특정 금융 상품의 이자 계산 로직
- 특정한 조건을 만족해야만 승인이 되는 보험금 청구 승인 판단 로직
도메인 객체에 도메인 규칙을 담지 못하는 이유는 규칙이 복잡하여 어느 한 도메인 객체에 속하지 않기 때문일 것이다. 혹은 도메인 객체 자체에 대한 내용이라 내부에 담기 어색한 규칙(🔗)인 경우도 있다.
도메인 주도 설계에서 도메인 서비스는 다음과 같은 특징을 가지며 철저히 독립적이고 순수한 영역이어야 한다는 것을 기억해야 한다.
- 외부 시스템 의존성이 거의 없음
- 트랜잭션 관리와도 관계가 없음
앱 서비스의 역할과 특징 및 예시
반면 애플리케이션 서비스는 이러한 도메인 서비스들에 의존하여 비즈니스 규칙을 처리하고, 그 결과를 외부 시스템에 반영하거나 사용자에게 전달하는 역할을 한다. 구체적인 예시로는 다음과 같은 것들이 있다.
- 주문 > 결제 > 재고 업데이트 > 배송 요청 일련의 과정을 처리하는 로직
- 사용자의 유저 등록 요청을 받으면 유효성 검증 후 도메인 로직을 적용한 후 데이터를 저장하는 작업
- 외부로 이벤트를 발행하는 로직
앱 서비스의 역할을 정리하면 다음과 같다.
- 입력 받은 데이터를 도메인 모델로 변환하는 것
- 여러 도메인 서비스들 및 외부 시스템 사이에서 조율하고 흐름을 제어
- 트랜잭션을 관리
주요 차이점 요약
도메인 서비스 | 애플리케이션 서비스 | |
주요 역할 | 도메인의 핵심 비즈니스 규칙을 처리 | 도메인 서비스나 리포지토리 등을 사용해 비즈니스 프로세스 조율 |
주로 다루는 것 | 비즈니스 규칙, 도메인 모델 간의 복잡한 로직 | 트랜잭션, 외부 시스템과의 상호작용, 사용자 입력 처리 등 |
When to use | 여러 엔티티나 도메인 객체에 걸친 복잡한 비즈니스 로직이 있을 때 | 여러 도메인 서비스와 리포지토리, 외부 시스템을 통합할 때 |
외부 시스템 의존성 | 거의 없음 | 데이터베이스, API, 메시지 큐, 이메일 서비스 등과 통합 |
헥사고날 아키텍처와의 관계
앱 서비스는 헥사고날 아키텍처로 치면 인터페이스인 Driving Port의 구현체(🔗)다. 그리고 도메인 서비스는 헥사고날의 가장 중심에 있는 도메인 영역에 해당한다.
요약
1. 도메인 서비스는 도메인 규칙을 표현하는 객체다. 2. 앱 서비스는 도메인 서비스를 사용하여 비즈니스 로직을 실행하고 흐름을 제어한다. |
참고 자료
- 「도메인 주도 설계 철저 입문」2020, 나루세 마사노부
- Hexagonal Architecture, there are always two sides to every story