Aggregate는 DDD(Domain-Driven Design)의 한 패턴이다.
마틴파울러
DDD에서 aggregate는 하나의 유닛으로 취급할 수 있는 도메인 오브젝트의 집합이다.
예로, 분리된 Order(주문)과 Line-items(주문 아이템) 객체는 하나의 주문이라는 단일 aggregate으로 다루기 유용하다.
하나의 aggregate는 aggregate root라는 객체를 갖는다. aggregate 외부에서의 모든 참조는 aggregate root만을 통해야 한다.
이 root는 aggregate의 전체로써 무결성을 보장할 수 있다.
aggregate는 데이터 저장소의 전송의 기본 요소이다. 트랜잭션은 aggregate 경계를 침범하면 안 된다.
DDD Aggregate는 컬렉션 클래스에서 혼란스러울 때가 있다.
DDD Aggregate는 도메인 개념인 반면 컬렉션은 일반적이다.
aggregate는 종종 간단한 필드와 함께 여러 컬렉션이 포함된다.
aggregate라는 용어는 일반적인 용어이며 다양한 컨텍스트(UML)에서 사용되며, 이 경우 DDD Aggregate와 동일한 개념이 아니다.
DDD에서 도메인 엔티티
DDD에서 도메인 엔티티는 데이터와 관련된 도메인 논리나 행동을 구현해야 한다.
예를 들어, 주문 엔티티 클래스의 일부로서 주문 항목, 데이터 유효성 검사, 총계를 추가하는 것 같은 작업 메서드로서 구현된 비즈니스 작업 및 논리가 포함돼야 한다.
엔티티의 메서드는 애플리케이션 계층에 엔티티 규칙을 분산하는 대신 엔티티의 규칙 및 고정화에 신경 써야 한다.
도메인 모델 엔티티는 메서드를 통해 동작을 구현한다.
경우에 따라 엔티티 클래스의 일부오 모든 논리를 구현하지 않는 엔티티를 포함할 수 있다.
이런 경우는 대부분의 논리가 Root Aggregate에서 정의되기 때문에 자식 엔티티가 특별한 논리를 갖지 않은 경우이다.
도메인 엔티티 대신 서비스 클래스에서 논리를 구현하는 복잡한 마이크로 서비스가 포함된 경우 빈약한 도메인 모델이 될 수 있다.
Aggregate Module
도메인 모델은 주문 완료나 재고 등의 중요한 기능 영역을 제어할 수 있는 관련 데이터 엔티티 및 프로세스의 클러스터를 포함한다.
더 정교한 DDD 단위는 응집력 있는 단위로 취급될 수 있는 동작 및 엔티티의 그룹이나 클러스터를 설명하는 Aggregate이다.
일반 적으로 필요한 트랜잭션을 기반으로 Aggregate를 정의한다.
전형적인 예는 주문 항목 목록을 포함하는 주문이다. 주문 항목은 대게 엔티티가 되지만, 일반적으로 Aggregate Root라고 하는 해당 Root 엔티티인 주문 엔티티를 포함하는 주문 집계라는 자식 엔티티가 된다.
Aggregate를 식별하기 어려울 수 있다. Aggregate는 서로 일치해야 하는 객체 그룹이지만, 객체 그룹을 막 선택해서 이를 Aggregate라고 부를 수 없다.
도메인 개념부터 시작해서 해당 개념과 관련된 가장 일반적인 트랜잭션에서 사용되는 엔티티를 고려해야 한다.
트랜잭션 관점에서 일관성 있는 작업에 대한 생각이 엔티티들을 Aggregate로 구성하기 좋은 방법이다.
Aggregate Root 또는 Root Entity Pattern
Aggregate는 최소 하나 이상의 엔티티로 구성돼 있다.
루트 엔티티 또는 기본 엔티티라고 하는 Aggregate Root이다.
Aggregate는 모든 엔티티 및 객체가 필요한 동작 및 트랜잭션을 구현하기 위해 함께 작업하는 가운데, 여러 자식 엔티티와 Value Object를 가질 수 있다.
Aggregate Root의 목적은 Aggregate의 일관성을 확보하는 데 있으며, Aggregate Root 클래스에서 메서드나 작업을 통해 집계를 업데이트하기 위한 유일한 진입점이 되어야 한다.
Aggregate Root를 통해서만 집계 내에서만 엔티티를 변경해야 한다.
Aggregate의 일관성 보호자(?)는 집계를 위해 준수해야 할 모든 고정불변 및 일관성 규칙을 고려해야 한다.
독립적으로 자식 엔티티나 Value Object를 변경하는 경우 Aggregate Root가 유효한 상태인지를 보장할 수 없다.
이는 호들 호들 거리는 다리를 가진 테이블과 같다(와장차창창앙창!)
일관성을 유지하는 것은 Aggregate Root의 주요 목적이다.
참고 사이트
- 마틴 파울러 DDD_Aggregate
https://martinfowler.com/bliki/DDD_Aggregate.html
- 마크로소프트 : 마이크로 서비스 도메인 모델 디자인
https://docs.microsoft.com/ko-kr/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/microservice-domain-model
'학자형 개발' 카테고리의 다른 글
Mocks Aren't Stubs! Mock과 Stub 에대하여 (0) | 2021.05.27 |
---|---|
JPA/Hibernate Cascade Types (0) | 2021.05.25 |
DDD 지향 마이크로 서비스 디자인 (0) | 2021.05.24 |
Cloud Native Archtecure 를 위해 고려햐야될 항목 (0) | 2021.04.11 |
Micro Service Archtecture 이해하기 4. 클라우드 네이티브의 이해 (0) | 2021.03.16 |