애그리거트간에 참조
- 한 객체가 다른 객체를 참조하는 것 처럼 애그리거트도 다른 애그리거트를 참조한다.
- 애그리거트의 관리 주체가 애그리거트 루트이므로 애그리거트에서 다른 애그리거트를 참조하는 것은 애그리거트의 루트를 참조하는 것과 같다.
- 애그리거트를 참조하면 한 애그리거트에서 다른 애그리거트를 수정하지 않도록 주의해야 한다.
- ‣를 사용할 경우 지연(Lazy)로딩과 즉시(Eager)로딩 두가지 방식으로 로딩이 가능하다.
아이디를 이용한 간접 참조
- ID를 이용한 참조는 DB 테이블에서 외래키를 사용해 참조한다.
- 장점
- 한 애그리거트에서 다른 애그리거트를 수정하는 문제를 원척적으로 방지할 수 있다.
- 애그리거트의 경계를 명확히 하고 물리적인 연결을 제거하기 때문에 모델의 복잡도를 낮춰준다.
- 애그리거트 간의 의존을 제거하므로 응집도를 높여준다.
- 단점
- 참조하는 애그리거트가 많을때 조회 속도가 문제가 될 수 있다.
- 참조가 많아진다면 QueryDsl을 사용해 전용 쿼리를 만들어 조회한다.
- 하지만 애그리거트간 다른 저장소를 사용하는 경우에는 한번에 쿼리로 조회할 수 없다.
- 이런경우 캐시를 적용하거나 조회전용 저장소를 따로 구성한다.
// Order 애그리거트
public class Order {
private Orderer orderer;
...
}
public class Orderer {
private MemberId memberId;
private String name;
...
}
// Member 애그리거트
public class Member {
private MemberId id;
...
}