주문 등록, 주문 취소, 상품 상세 조회 등과 같은 기능 구현
도메인 모델을 사용하여 기능을 구현한다.
⇒ 로직을 직접 수행하기 보다, 도메인 모델에 로직 수행을 위임한다.
public class CancelOrderService {
@Transactional
public void cancelOrder(String orderId){
Order order = findOrderById(orderId);
if (order == null) throw new OrderNotFoundException(orderId);
order.cancel();
}
...
}
: 상위 계층에서 하위 계층으로의 의존만 존재하고, 하위 계층에서 상위 계층으로의 의존은 존재하지 않는다.
⇒ DIP를 사용하여 ‘테스트 어려움’ 과 ‘기능 확장의 어려움’을 해결하자.
고수준 모듈 : 의미 있는 단일 기능을 제공하는 모듈
저수준 모듈 : 하위 기능을 실제로 구현한 것
고수준 모듈이 제대로 동작하려면 저수준 모듈을 사용해야 하지만, 이때 테스트 어려움, 기능 확장 어려움이 발생한다.
⇒ DIP를 이용하여 저수준 모듈이 고수준 모듈에 의존하게 하자.
추상화 인터페이스
CaculateDiscountService 입장에서 룰 적용을 Drools로 했는지, java로 직접 썼는지 어쨌는지는 중요하지 않다.
public **interface RuleDiscounter** {
public Money applyRules(Customer customer, List<OrderLine> orderLines);
}
public class CalculateDiscountService {
**private RuleDiscounter ruleDiscounter;**
public CalculateDiscountService(RuleDiscounter ruleDiscounter){
this.ruleDiscounter = ruleDiscounter;
}
public Money calculateDiscount(OrderLine orderLines, String customerId){
Customer customer = findCustomer(customerId);
return ruleDiscounter.applyRules(customer, orderLines);
}
...
}
public class DroolsRuleDiscounter **implements RuleDiscounter** {
...
@Override
public Money applyRules(Customer customer, List<OrderLine> orderLines){
...
}
}