애그리거트(Aggregate)는 비슷한 업무 도메인들의 묶음을 말한다. 즉, 위 그림에서 애그리거트(Aggregate)는 총 4개가 된다.
애그리거트(Aggregate)는 한마디로 비슷한 범주의 연관된 업무들을 하나로 그룹화 해놓은 그룹이라고 말할 수 있다.
정의한 네 개의 애그리거트 안에는 1개 이상의 도메인들이 있는데, 각각의 애그리거트에는 해당 애그리거트를 대표하는 도메인이 존재한다.
각 애그리거트 내의 도메인들 중에서 다른 모든 도메인들과 직간접적으로 연관이 되어 있는 도메인들을 발견할 수 있다.
회원 애그리거트의 경우, ‘회원 포인트’가 얼마인지 알려면 해당 포인트를 가지는 ‘회원 정보’를 알아야 한다. 즉, ‘회원 정보’ 도메인이 애그리거트 루트가 된다.
주문 애그리거트의 경우, ‘주문 정보’가 다른 모든 도메인과 직접적으로 관련이 있다. 즉 ‘주문 정보’ 도메인이 애그리거트 루트가 된다.
데이터베이스의 테이블 간 관계로 보자면, 애그리거트 루트는 부모 테이블이 되고, 애그리거트 루트가 아닌 다른 도메인들은 자식 테이블이 되는 셈이다.
애그리거트 루트(Aggregate Root)의 기본키 정보를 다른 도메인들이 외래키 형태로 가지고 있다고 볼 수 있다.
테이블의 외래키(Foreign key) vs 클래스의 객체 참조 리스트(List)
테이블 간의 관계는 외래키라는 연결 요소가 있어서 직관적이다. 그런데 클래스들 간에는 외래키라는 연결 요소가 없다. 대신에 클래스들은 객체 간에 참조가 가능하기때문에 이 객체 참조를 사용해서 외래키의 기능을 대신한다.
ORM(Object-Relational Mapping)에서 가장 헷갈리는 것들 중에 하나가 바로 외래키를 객체 참조로 표현하는 것이다.
MEMBER 테이블/ORDERS 테이블과 Member 클래스/Order 클래스를 비교해보면,
MEMBER 테이블은
member_id
를ORDERS
테이블의 외래키로 지정하면 된다. 그러면ORDERS
테이블의 데이터를 조회할 수 있다. 테이블 간에 조인(join)을 하면 되기 때문이다.그런데 Member 클래스에는 외래키가 존재하지 않는다. Member 클래스가 Order 클래스의 데이터를 조회하려면 객체 참조가 있으면 된다.
카페에 가면 커피를 여러번 주문할 수 있듯이 Member 클래스 역시 Order 클래스의 객체를 여러개 가질 수 있습니다. 여러개의 객체를 표현하려면
List
,Set
같은 컬렉션을 사용해서 표현할 수 있다.
(1) 모든 엔티티 객체의 상태는 애그리거트 루트를 통해서만 변경할 수 있다.
(2) 하나의 동일한 애그리거트 내에서의 엔티티 객체 참조
(3) 애그리거트 루트 대 애그리거트 루트 간의 엔티티 객체 참조
애그리거트 루트 간의 참조는 객체 참조 대신에 ID로 참조한다.
1대1과 1대N 관계일 때는 테이블 간의 외래키 방식과 동일하다.
N대N 관계일 때는 외래키 방식인 ID 참조와 객체 참조 방식이 함께 사용된다.