본문 바로가기
Back-end/벡엔드

도메인 주도 개발 - 도메인서비스

by javapp 자바앱 2024. 5. 15.
728x90

도메인서비스

 

 

도메인 서비스 객체를 애그리거트에 주입하지 않기

public class Order {
    @Authwired
    private DiscountService discountService;
    ..
}

 

Service 필드는 데이터 자체와는 관련이 없다. 저장 대상도 아니다.

일부 기능만 필요로 하기 때문에 굳이 의존 주입을 할 이유는 없다.

 

public class Order{
    public void calculate(DiscountService discountService, .. ) {
        ....
    }
}

 

public class OrderService {
    private DiscountService discountService;
    
    private Order createOrder(....) {
    	// 사용하고 싶은 곳에 사용
        this.discountService
    }
}

 

 

 

도메인 서비스의 패키지 위치

 

주문 금액 계산을 위한 도메인 서비스는 
주문 애그리거트와 같은 패키지에 위치한다.

 

 

 

 

도메인 서비스의 인터페이스와 클래스

도메인 서비스는 인터페이스로 추상화하여
도메인 영역이 특정 구현에 종속되는 것을 방지, 테스트가 쉬워지는 점이 있다.

 

 

 

외부 시스템과 연동시  나타나는 구조

 

public interface ProductRecService {
	List<Product> getRec(Long id);
}

 

 

public class RecClient implements ProductRecService {
	private ProductRepository productRepository;
    
    @Override
    public List<Product> getRec(Long id) {
    	List<RecommendationItem> items = getRecItems(id);
        return toProducts(items);
    }
    
    private List<RecommendationItem> getRecItems(String id) {
    	// 외부 추천 시스템 API를 통해 가져오는 상황
        return externalRecClient.getRecs(itemId);
    }
    
    private List<Product> toProducts(List<RecommendationItem> items) {
    	return items.stream()
        		..
    }
    
}

toProducts 를 통해 해당 도메인에 맞게 모델 변환

변환(Translator) 클래스를 생성해서 변환을 처리해도 된다.

 

RecClient 는 외부 시스템과의 연동을 처리하는데 외부 시스템의 도메인 모델이 내 도메인 모델을 침범하지 않도록 막아주는 역할을 한다. 안티코럽션 계층이 된다.

 

 

 

 

 

 

 

 

참고: 도메인 주도 개발 시작하기

댓글