반응형
애그리거트간에 참조
- 한 객체가 다른 객체를 참조하는 것 처럼 애그리거트도 다른 애그리거트를 참조한다.
- 애그리거트의 관리 주체가 애그리거트 루트이므로 애그리거트에서 다른 애그리거트를 참조하는 것은 애그리거트의 루트를 참조하는 것과 같다.
- 애그리거트를 참조하면 한 애그리거트에서 다른 애그리거트를 수정하지 않도록 주의해야 한다.
- JPA를 사용할 경우 지연(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;
...
}
애그리거트의 영속성 전파
- 애그리거트가 완전한 상태여야 한다는 것은 애그리거트 루트를 조회할 때뿐만 아니라 저장하고 삭제할 때도 하나로 처리해야 한다.
- 저장 메서드에서는 애그리거트 루트만 저장하면 안되고 애그리거트에 속한 모든 객체를 저장해야 한다.
- 삭제 메서드는 애그리거트 루트뿐만 아니라 애그리거트에 속한 모든 객체를 삭제해야 한다.
- @Embeddable 매핑 타입의 경우 함께 저장되고 삭제되지만 @Entity 타입에 대한 매핑은 cascade 속성을 사용해서 저장과 삭제 시 함께 처리되도록 설정해야 한다.
// Entity 타입 매핑은 cascade 속성 설정)
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = ture)
@JoinCoulmn(name = "product_id")
@OrderColumn(name = "list_idx")
private List<Image> images = new ArrayList<>();
반응형
'DDD' 카테고리의 다른 글
도메인(Domain) 서비스란? (0) | 2021.09.15 |
---|---|
애그리거트(Aggregate) 트랜잭션 관리 (0) | 2021.09.15 |
DIP(역전 의존 원칙)란? (0) | 2021.09.14 |
AttributeConverter를 이용한 밸류 매핑 처리 (0) | 2021.09.14 |
@SecondaryTable을 이용한 밸류 매핑 설정 (0) | 2021.09.14 |