개요
- 외부 시스템이나 타 도메인과의 연동 기능도 도메인 서비스가 될 수 있음.
- 도메인 서비스는 도메인의 로직 관점에서 인터페이스를 작성, 인프라스트럭처 영역에서 구현
예시
- 도메인 서비스 인터페이스
public interface SurveyPermissionChecker { boolean hasUserCreationPermission(String userId); }
- 응용 서비스
public class CreateSurveyService { private SurveyPermissionChecker permissionChecker; public Long createSurvey(CreateSurveyRequest req) { validate(req); // 도메인 서비스를 이용해서 외부 시스템 연동을 표현 if (!permissionChecker.hasUserCreationPermission(req.getRequestorId())) { throw new NoPermissionException() } } }
- 인프라 스트럭쳐 영역
public class SurveyPermissionCheckerImpl implements SurveyPermissionChecker { private RoleManagementApi roleManagementApi; public boolean hasUserCreationPermission(String userId) { // HTTP API 호출로 역할 관리 시스템과 연동 return roleManagementApi.hasRole(userId, "SURVEY_CREATOR"); } }
외부 시스템과 연동도 내 도메인 모델의 일부로 통합하여 관리할 수 있음.
OpenFeign 을 사용하는 경우 API 호출부만 별도로 또 분리가 가능하다.
도메인 서비스의 패키지 위치
- 도메인 서비스
- 도메인 고유의 작업을 수행하는 STATELESS 한 작업, 도메인 로직을 표현함.
예를들어
실무적인 예시로,
- 만약 주문 금액을 계산하는 로직이 복잡하고 여러 요소에 의존한다면,
- 이를
Order
애그리거트 내에 직접 구현하는 대신
DiscountCalculationService
라는 별도의 도메인 서비스로 분리할 수 있다.- 이 서비스는 할인 규칙, 프로모션, 고객 등급 등 다양한 요소를 고려하여 최종 주문 금액을 계산하는 책임을 가진다.
도메인로직이 복잡해질 것 같으면 분리하라는 이야기같다.
Uploaded by N2T
'도메인주도개발' 카테고리의 다른 글
이벤트 개요 (0) | 2024.01.27 |
---|---|
[DDD] 도메인 서비스 (0) | 2024.01.25 |
[DDD] 오프라인 선점 잠금 (0) | 2024.01.25 |
[DDD] 오프라인 선점 잠금 관련 LockManager 인터페이스와 관련 클래스 (0) | 2024.01.25 |
[DDD] 응용 서비스의 역할 (0) | 2024.01.19 |