도메인 모델이 복잡해질수록 개별 객체 단위로 데이터를 관리하면 비즈니스 규칙의 일관성이 쉽게 깨집니다.
관련된 객체들을 하나의 Aggregate로 묶으면 관련된 맥락과 필요한 정보를 한곳에서 모두 파악할 수 있어 사람의 인지 부하를 크게 줄일 수 있습니다.
또한, 바운디드 컨텍스트(BC) 내부에서 데이터 변경의 명확한 단위를 확립하기 위해 반드시 필요합니다.
트랜잭션(Transaction) 경계의 확립
애그리거트의 가장 중요한 존재 이유는 관련된 객체들을 묶어 데이터 무결성을 보장하는 하나의 완벽한 트랜잭션 경계를 만드는 것입니다.
애그리거트는 Root Entity, 내부 Entity, 그리고 식별자 없이 속성 자체로 의미를 갖는 **Value Object(값 객체)**로 구성됩니다.
데이터 보호와 비즈니스 로직의 일관성을 강제하기 위해 다음 3가지 핵심 규칙을 반드시 지켜야 합니다.
ProductOption) 객체를 직접 조회하거나 DB에서 꺼내올 수 없으며, 반드시 루트인 상품(Product) 객체를 통해서만 접근해야 합니다.ProductOption.changePrice()를 직접 호출하는 것은 금지되며, 반드시 Product.changeOptionPrice()라는 루트의 메서드를 거쳐 비즈니스 일관성 검증을 받아야 합니다.Product와 내부의 ProductOption 객체들은 한 번의 DB 트랜잭션으로 동시에 저장됩니다. 단, '상품(Product)' 애그리거트와 '주문(Order)' 애그리거트를 하나의 트랜잭션으로 묶어서 동시 수정하는 것은 금지되며, 이 경우 도메인 이벤트(Domain Event)를 발행하여 결과적 일관성(Eventual Consistency)을 맞추어야 합니다.