3. 애그리거트
3.1 애그리거트
- 객체 모델이 복잡해지면 구조나 도메인간의 관계를 파악하는 것이 어려워진다. 이는 코드를 변경하고 확장하는 것이 어려워진다는 것을 뜻함.
- 애그리거트를 이용한다면, 복잡한 도메인을 연관된 객체로 묶어 도메인 간의 관계를 쉽게 파악할 수 있음
- 애그리거트는 경계를 가짐
- 도메인 규칙과 요구사항은 애그리거트의 경계를 설정하는 기준임
- 함께 변경되는 빈도가 높은 객체는 한 애그리거트에 속할 가능성이 높음
- A가 B를 갖는다로 해석할 수 있는 요구사항이 존재하더라도 이것이 반드시 A와 B가 한 애그리거트에 속한다는 것을 의미하는 것은 아님.
3.2 애그리거트 루트
-
애그리거트 루트란 애그리거트에 속한 모든 객체가 일관된 상태를 유지하기위한 애그리거트 전체 관리 주체
-
애그리거트 루트의 핵심 역할은 애그리거트의 일관성이 깨지지 않도록 지키는 것
-
한 트랜잭션에서는 한 개의 애그리거트만 수정해야 하며 두 개 이상의 애그리거트를 수정해야할 경우 응용 서비스에서 두 애그리거트를 수정하도록 구현함
3.3 리포지터리와 애그리거트
- 애그리거트는 개념상 완전한 한 개의 도메인 모델을 표현하므로 객체의 영속성을 처리하는 리포지터리는 애그리거트 단위로 존재함
3.4 ID를 이용한 애그리거트 참조
-
애그리거트는 서로 참조할 수 있음
- ex) JPA - @ManyToOne, @OneToOne
-
필드를 이용한 애그리거트 참조는 다음의 문제를 야기.
- 편한 탐색 오용
- 성능에 대한 고민
- 확장 어려움
이중 가장 큰 문제는 편리함을 오용할 수 있다는 것
-> 이 문제를 해결하기 위해 ID 참조를 사용하여 간접참조형태로 변경
ID 참조를 통해서 결합도를 낮추고 응집도를 높일 수 있음
많은 도움이 되었습니다, 감사합니다.