[DDD START] 2장 아키텍처 개요

고수준 모듈과 저수준 모듈

고수준 모듈이 저수준 모듈에 의존할 때 문제점

DIP (Dependency Inversion Principle)

DIP는 이 문제를 해결하기 위해 저수준 모듈이 고수준 모듈에 의존하도록 바꾼다.

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 Moeny calculateDiscount(List<OrderLine> orderLines, String customerId) {
        Customer customer = findCustomer(customerId);
        return ruleDiscounter.applyRules(customer, orderLines);
    }   
    ...
}

public class DroolsRuleDiscounter implements RuleDiscounter {
    private kieContainer kContainer;

    public DroolsRuleDiscounter() {
        KieServices ks = KieServices.Factory.get();
        kContainer = ks.getKieClasspathContainer();
    }

    @Override
    public Moeny applyRule(Customer customer, List<OrderLine> orderLines) {
        KieSession kSession = KContainer.newKieSession("");
        // 계산 로직
        ...
    }
}

고수준 모듈이 저수준 모듈을 사용하려면 고수준 모듈이 저수준 모듈에 의존해야 하는데, 반대로 저수준 모듈이 고수준 모듈에 의존한다고 해서 Dependency Inversion Principle 이라고 부른다

도메인 영역의 주요 구성요소

Entity

Value

Aggregate

Aggregate Root

군집에 속한 객체들을 관리하는 엔티티

Repository

Domain Service

인프라스트럭처

Reference