Spring Data JDBC 기반의 도메인 엔티티 및 테이블 설계

seongmin·2022년 10월 30일
0

Spring

목록 보기
27/38
post-thumbnail

애그리거트(Aggregate)

애그리거트(Aggregate)는 비슷한 업무 도메인들의 묶음을 말한다. 즉, 위 그림에서 애그리거트(Aggregate)는 총 4개가 된다.

애그리거트(Aggregate)는 한마디로 비슷한 범주의 연관된 업무들을 하나로 그룹화 해놓은 그룹이라고 말할 수 있다.

애그리거트 루트(Aggregate Root)

정의한 네 개의 애그리거트 안에는 1개 이상의 도메인들이 있는데, 각각의 애그리거트에는 해당 애그리거트를 대표하는 도메인이 존재한다.

각 애그리거트 내의 도메인들 중에서 다른 모든 도메인들과 직간접적으로 연관이 되어 있는 도메인들을 발견할 수 있다.

  • 회원 애그리거트의 경우, ‘회원 포인트’가 얼마인지 알려면 해당 포인트를 가지는 ‘회원 정보’를 알아야 한다. 즉, ‘회원 정보’ 도메인이 애그리거트 루트가 된다.

  • 주문 애그리거트의 경우, ‘주문 정보’가 다른 모든 도메인과 직접적으로 관련이 있다. 즉 ‘주문 정보’ 도메인이 애그리거트 루트가 된다.

데이터베이스의 테이블 간 관계로 보자면, 애그리거트 루트는 부모 테이블이 되고, 애그리거트 루트가 아닌 다른 도메인들은 자식 테이블이 되는 셈이다.

애그리거트 루트(Aggregate Root)의 기본키 정보를 다른 도메인들이 외래키 형태로 가지고 있다고 볼 수 있다.

테이블의 외래키(Foreign key) vs 클래스의 객체 참조 리스트(List)

테이블 간의 관계는 외래키라는 연결 요소가 있어서 직관적이다. 그런데 클래스들 간에는 외래키라는 연결 요소가 없다. 대신에 클래스들은 객체 간에 참조가 가능하기때문에 이 객체 참조를 사용해서 외래키의 기능을 대신한다.

ORM(Object-Relational Mapping)에서 가장 헷갈리는 것들 중에 하나가 바로 외래키를 객체 참조로 표현하는 것이다.

MEMBER 테이블/ORDERS 테이블과 Member 클래스/Order 클래스를 비교해보면,

MEMBER 테이블은 member_idORDERS 테이블의 외래키로 지정하면 된다. 그러면 ORDERS 테이블의 데이터를 조회할 수 있다. 테이블 간에 조인(join)을 하면 되기 때문이다.

그런데 Member 클래스에는 외래키가 존재하지 않는다. Member 클래스가 Order 클래스의 데이터를 조회하려면 객체 참조가 있으면 된다.

카페에 가면 커피를 여러번 주문할 수 있듯이 Member 클래스 역시 Order 클래스의 객체를 여러개 가질 수 있습니다. 여러개의 객체를 표현하려면 List , Set 같은 컬렉션을 사용해서 표현할 수 있다.

애그리거트 객체 매핑 규칙

(1) 모든 엔티티 객체의 상태는 애그리거트 루트를 통해서만 변경할 수 있다.

(2) 하나의 동일한 애그리거트 내에서의 엔티티 객체 참조

  • 동일한 하나의 애그리거트 내에서는 엔티티 간에 객체로 참조한다.

(3) 애그리거트 루트 대 애그리거트 루트 간의 엔티티 객체 참조

  • 애그리거트 루트 간의 참조는 객체 참조 대신에 ID로 참조한다.

  • 1대1과 1대N 관계일 때는 테이블 간의 외래키 방식과 동일하다.

  • N대N 관계일 때는 외래키 방식인 ID 참조와 객체 참조 방식이 함께 사용된다.

0개의 댓글