3.1 애그리거트란?
- 연관된 엔티티와 밸류 객체를 개념적으로 하나로 묶은 것이다.
- 복잡한 도메인을 이해하고 관리하기 쉬운 단위로 만드는 방법이 애그리거트 묶은 단위로 표현하는 것이다.
상위 수준의 개념을 이용해서 전체 모델을 정리하면 전반적인 관계를 이해 하는데 도움이 된다.
반대로 상위 수준에서의 개념을 파악하려면 오랜 시간이 걸린다.
도메인의 객체 모델이 복잡해지면 개별 구성요소 위주로 모델을 이해하게 되고 전반적인 구조나 큰수준에서 도메인 간의 관계를 파악하기 어려워진다. 즉, 코드를 변경하고 확장하는 것이 어려워진다.
애그리거트의 장점
- 모델의 이해도가 높아진다.
- 일관성 있게 관리하게 한다.
- 복잡도가 낮아져 확장하는데 도움을 준다.
3.2 애그리거트 루트
- 애그리거트에 속한 모든 객체가 일관성을 가지게 하려면 전체를 관리할 엔티티가 필요하다.
- 엔티티 : 애그리거트 루트 엔티티
도메인 규칙과 일관성
- 애그리거트 루트의 핵심 역할은 애그리거트의 일관성을 깨뜨리지 않는 것이다.
- 애그리거트 루트는 애그리거트가 제공해야 할 도메인 기능을 구현해야 한다.
- 애그리거트 외부에서 내부 상태를 함부로 바꾸면 일관성이 깨질 가능성이 있으므로 setter() 메서드를 피해야 한다.
애그리거트 루트의 기능 구현
- 애그리거트 루투는 애그리거트 내부의 다른 객체를 조합해서 기능을 완성한다.
트랜잭션 범위
- 트랜잭션 범위는 작을수록 좋다.
- 여러 테이블을 수정하는 것과 하나 테이블을 수정하는 것의 성능은 차이가 발생한다.
- Lock 대상이 많아지므로 성능을 떨어뜨린다.
한 트랜잭션에서 2개 이상의 애그리거트를 수정히야 한다면 애그리거트에서 다른 애그리거트를 직접 수정하지 말고 서비스 계층에서 두 애그리거트를 수정하도록 구현한다.
- 예제 코드
- Screening 애그리거트와 Consumer 애그리거트는 서로 다르므로 서비스 계층에서 각각 조회 처리를 하였다.
3.3 리포지터리와 애그리거트
- 애그리거트를 구하는 리포지터리 메서드는 완전한 애그리거트를 제공해야 한다.
- 올바른 데이터를 제공하지 않으면 NullPointException 과 같은 문제가 발생한다.
3.4 ID를 이용한 애그리거트 참조
- 한 객체가 다른 객체를 참조하는 것처럼 애그리거트도 다른 애그리거트를 참조할 수 있다.
- 다른 애그리거트 참조 예제 코드
order.getOrderer().getMember().getId();
문제점
- 편한 탐색 오용
- 성능에 대한 고민
- 확장 어려움
개선
- ID 참조를 사용하고 객채가 참조 로 연결되지 않고 한 애그리거트에 속한 객체들만 참조로 연결하게 한다.
- 애그리거트의 경계를 명확히 하고
- 애그리거트 간 물리적인 연결을 제거하기 때문에
- 모델의 복잡도를 낮춰준다.
- 로딩 전략을 고민하지 않아도 된다.
N + 1 의 Query 발생시?
- ID 참조 방식에서 객체 참조 방식으로 다시 되돌린다.
- 조회 전용 쿼리 즉, 조인을 하여 한 번의 쿼리로 필요한 데이터를 로딩하면 된다.
'Book > 도메인 주도 계발 시작하기' 카테고리의 다른 글
애그리거트 트랜잭션 관리 (1) | 2022.12.28 |
---|---|
도메인 서비스 (0) | 2022.12.28 |
스프링 데이터 JPA를 이용한 조회 기능 (0) | 2022.12.26 |
응용 서비스와 표현 영역 (0) | 2022.12.26 |
리포지터리와 모델 구현 (0) | 2022.12.22 |
아키텍처 개요 (0) | 2022.12.21 |
도메인 모델 시작하기 (0) | 2022.12.20 |