애그리거트(Aggregate)
소프트웨어 마에스트로 14기 팀 프로젝트에서 나는 백엔드 파트를 담당하여 Spring Boot를 통한 WAS 개발을 하게 되었다. WAS 서버를 개발하던 도중 도메인을 어떻게 구분하는 것이 좋을 지 고민하다 학습을 위해 게시글을 작성하게 되었다.
Aggregate?
도메인 개념 간의 관계를 파악하기 어렵다는 것은 곧 코드를 변경하고 확장하는 것이 어려워진다는 것을 의미한다. 상위수준에서 모델이 어떻게 엮여 있는지 알아야 전체 모델을 망가뜨리지 않으면서 추가 요구사항을 모델에 반영할 수 있는데, 세부적인 모델만 이해한 상태로는 코드를 수정하기가 어렵기 때문에 코드 변경을 최대한 회피하는 쪽으로 요구사항을 협의하게 될 수 있다.
복잡한 도메인을 이해하고 관리하기 쉬운 단위로 만들기 위해서는 상위 수준에서 모델을 조율할 수 있는 방법이 필요한데, 이 방법이 바로 애그리거트이다. 애그리거트(Aggregate)는 도메인 주도 설계(Domain-Driven Design, DDD)의 핵심 개념 중 하나로, 일관된 트랜잭션 단위로 함께 작동하는 연관된 객체의 집합을 의미한다. 애그리거트는 각각의 도메인 모델을 보호하며, 비즈니스 규칙이 일관되게 적용되도록 하는 역할을 한다. 수많은 객체를 애그리거트로 묶어서 바라보면 좀 더 상위 수준에서 도메인 모델 간의 관계를 파악할 수 있다.
Aggregate 특성
루트 엔티티
각 애그리거트는 루트 엔티티(혹은 애그리거트 루트)를 가진다. 이 루트 엔티티를 통해 다른 엔티티나 값 객체에 접근할 수 있다. 또한, 외부 객체는 루트 엔티티를 통해서만 애그리거트 내의 다른 객체와 상호작용할 수 있다.
경계
애그리거트는 명확한 경계를 가지며, 애그리거트 내의 객체는 같은 트랜잭션 내에서 일관된 상태를 유지해야 한다. 즉, 트랜잭션의 단위는 애그리거트를 기준으로 한다.
일관성
루트 엔티티는 애그리거트 내의 일관성을 유지하는 데 중요한 역할을 한다. 루트 엔티티는 애그리거트 내의 모든 비즈니스 규칙이 정확하게 적용되도록 보장한다.
예시
온라인 쇼핑몰의 주문 시스템에서 주문
애그리거트는 주문 항목
, 배송 주소
, 결제 정보
등의 객체를 포함할 수 있을 것이고, 이 경우 주문
이 애그리거트 루트가 된다. 이 주문
애그리거트는 주문의 생성부터 배송까지의 모든 행동과 상태를 캡슐화하며, 주문에 관련된 모든 비즈니스 로직을 관리한다.