[DDD START] 4장 리포지터리와 모델구현(JPA 중심) - 애그리거트
14 Jul 2019애그리거트는 개념적으로 하나여야 한다
하지만 루트 엔티티를 로딩하는 시점에 애그리거트에 속한 객체를 모두 로딩해야 하는 것은 아니다
표현 영역에서 애그리거트의 상태 정보를 보여줄 때 정보가 필요하다?
- 별도의 조회 전용 기능을 구현하는 방식이 유리할 때가 많기 때문에 애그리거트의 완전성은 상태 변경과 더 관련이 있다
상태를 변경하는 기능을 수행할 때 애그리거트 상태가 완전해야 한다?
- 애그리거트를 완전한 상태로 로딩할 필요는 없다
- JPA는 트랜잭션 범위 내에서 지연 로딩을 허용하기 때문에 실제로 상태를 변경하는 시점에 필요한 구성 요소만 로딩해도 문제가 되지 않는다
- 일반적으로 상태 변경의 빈도가 낮기 때문에 지연 로딩을 사용할 때 발생하는 추가 쿼리의 비용 문제는 크지 않다
@Transactional
public void removeOptions(ProductId id, int optIdxToBeDeleted) {
// Product를 로딩. 컬렉션은 지연 로딩으로 설정했다면, Option은 로딩하지 않음
Product product = productRepository.findById(id);
// 트랜잭션 범위이므로 지연 로딩으로 설정한 연관 로딩 가능
product.romoveOption(optIdxToBeDeleted);
}
애그리거트의 영속성 전파
- 애그리거트 루트 뿐만 아니라 애그리거트에 속한 모든 객체가 조회, 저장, 삭제 시 하나로 처리되어야 한다