도메인 주도 개발 시작하기 : 7장 도메인 서비스

일단 해볼게·2025년 8월 17일
0

book

목록 보기
24/31

7.1 여러 애그리거트가 필요한 기능

  • 예시 > 결제 금액 계산 로직
    • 상품, 주문, 할인 쿠폰, 회원 애그리거트 등 필요
  • 한 애그리거트에 넣기 애매한 도메인 기능을 억지로 특정 애그리거트에 구현하면 안 된다.
    • 억지로 구현하면 자신의 책임 범위를 넘어서는 기능을 구현
    • 외부 의존 증가
    • 코드 복잡성 증가
    • 도메인 기능을 별도 서비스로 구현하면 해결

7.2 도메인 서비스

  • 도메인 사용하는 상황

    • 계산 로직 : 여러 애그리거트가 필요한 계산 로직
    • 외부 시스템 연동이 필요한 도메인 로직 : 구현하기 위해 타 시스템을 사용해야하는 도메인 로직
  • 할인 금액처럼 한 애그리거트에 넣기 애매한 도메인 개념을 구현하려면 도메인 서비스를 이용해서 도메인 개념을 명시적으로 드러내면 된다.

    • 할인 계산 서비스를 사용하는 주체는 애그리거트가 될 수도 있고 응용 서비스가 될 수도 있다.
    • 애그리거트 객체에 도메인 서비스를 전달하는 것은 응용 서비스의 책임이다.
      public class Order {
          public void calculateAmounts(
              DiscountCalculationService disCalSvc, MemberGrade grade) {
                  Money totalAmounts = getTotalAmounts();
                  Money discountAmounts =
                      disCalSvc.calculateDiscountAmounts(this.orderl_ines, this.coupons, grade);
      }
    • 도메인 서비스 객체를 애그리거트에 주입하지 않기
      • 도메인 객체는 필드로 구성된 데이터와 메서드를 이용해서 하나의 모델을 표현하는데, 도메인 서비스는 데이터 자체와는 관련이 없기 때문이다.
      • 도메인 객체의 일부 기능을 위해 도메인 서비스 객체를 의존 주입할 이유도 없다.
  • 도메인 서비스는 도메인 로직을 수행하지 응용 로직을 수행하진 않는다.

    public class Transferservice {
    	public void transfer(Account fromAcc, Account toAcc, Money amounts) {
    		fromAcc.withdraw(amounts);
    		toAcc.credit(amounts);
    }
    ...
    • 트랜잭션 처리와 같은 로직은 응용 서비스에서 처리해야 한다.
  • 외부 시스템 연동과 도메인 서비스

    • 예시 > 설문 조사 시스템
      - 사용자가 생성 권한을 가진 역할인지 확인하기 위해 역할 관리 시스템과 연동
      - 설문 조사 도메인 로직 관점에서 인터페이스를 작성 → 역할 관리 시스템과 연동한다는 관점으로는 작성하지 않았다.

    • 도메인 서비스의 개수가 많거나 엔티티나 밸류와 같은 다른 구성요소와 명시적으로 구분하고 싶다면 domain 패키지 밑에 domain.model, domain.service, domain.repository와 같이 하위 패키지를 구분하여 위치시켜도 된다.

  • 도메인 서비스의 구현이 특정 구현 기술에 의존하거나 외부 시스템 API를 실행한다면 인터페이스로 추상화

profile
시도하고 More Do하는 백엔드 개발자입니다.

0개의 댓글