[DDD] 외부 시스템 연동과 도메인 서비스

개요

  • 외부 시스템이나 타 도메인과의 연동 기능도 도메인 서비스가 될 수 있음.
  • 도메인 서비스는 도메인의 로직 관점에서 인터페이스를 작성, 인프라스트럭처 영역에서 구현

예시

  • 도메인 서비스 인터페이스
    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