Chapter 3. 애그리거트(Aggregate)
3.1 애그리거트
애그리거트는 복잡한 도메인을 이해하고 관리하기 쉬운 단위로 만들어 상위 수준에서 모델을 조망하기 위해 사용한다.
애그리거트는 엔티티 안에 밸류를 넣음으로 관련 객체를 묶는 방식으로 구현한다. 관련 객체를 하나로 묶기 때문에 루트 엔터티를 만들 때 관련 밸류 오브젝트도 함께 생성해야한다.
애그리거트는 보통 한 개의 엔터티 객체만 갖는다. 두 개 이상의 엔터티는 드물다.
3.2 애그리거트 루트
애그리거트에 속한 모든 객체가 일관된 상태를 유지하려면 애그리거트 전체를 관리할 주체가 필요하며,
이 주체는 루트 엔터티이다. 애그리거트 루트라고도 한다.
3.2.1 도메인 규칙과 일관성
루트의 핵심 역할은 도메인 규칙에 따라서 애그리거트의 일관성이 꺠지지 않도록 하는 것이다.
객체를 변경할 시 다음과 같이 변경한다.
애그리거트 외부에서 애그리거트에 속한 객체를 통한 get 메서드로 가져와서 상태를 변경하는 것이 아니라
객체에게 변경을 명령하는 식으로 변경한다.
//get 메서드로 객체 정보를 가져와서 변경한다 (X)
ShippingInfo si = order.getShippingInfo();
si.setAddress(newAddress);
// 객체에게 변경을 명령한다 (O)
order.changeShippingInfo(newShippingINfo);
3.2.2 애그리거트 루트의 기능 구현
애그리거트 루트는 내부의 다른 객체를 이용해서 구현한다.
애그리거트 외부에서 상태 변경을 하면 객체 내부의 값이 바뀌지 않는 버그가 생길 수 있기에 이를 막기 위해서 불변 객체를 사용하거나 protected를 이용한다.
public class Order {
protected Order() {
}
}
3.2.3 트랜잭션 범위
하나의 트랜잭션에서 한 개의 애그리거트만 수정하도록 한다. 하나의 트랜잭션에서 여러개의 애그리거트를 수정하면 충돌이 발생할 수 있으며 전체적인 성능이 떨어지기 때문이다.
하나의 트랜잭션에서 두 개 이상의 애그리거트를 변경해야하는 일이 생긴다면 애그리거트에서 수정하는 것이 아닌 서비스단에서 변경하는 코드를 짠다.
참고: 도메인 주도 개발 시작하기 책
'DDD(Domain Driven Design)' 카테고리의 다른 글
DDD(Domain Driven Design) 엔티티와 밸류 (0) | 2024.03.19 |
---|
댓글