애그리거트 객체 매핑 규칙
(1) 모든 엔티티 객체의 상태는 애그리거트 루트를 통해서만 변경할 수 있다.
-DDD에서 사용하는 중요한 핵심 규칙.
-결과적으로 애그리거트 루트를 통해서 나머지 엔티티에 접근한다는 것은 어떤식으로든 애그리거트 루트가 나머지 모든 엔티티에 대한 객체를 직간접적으로 참조 할 수 있다는 의미.
-도메인 규칙의 일관성을 유지하도록 하는 것.
(2) 하나의 동일한 애그리거트 내에서의 엔티티 객체 참조
-동일한 하나의 애그리거트 내에서는 엔티티 간에 객체로 참조.
(3) 애그리거트 루트 대 애그리거트 루트 간의 엔티티 객체 참조
-애그리거트 루트 간의 참조는 객체 참조 대신에 ID로 참조.
애그리거트 루트 간에 객체로 참조하지 않고, 테이블에 외래키를 추가하듯이 참조하고자 하는 애그리거트 루트의 ID를 참조 값으로 멤버 변수에 추가.
하지만 1대N일 경우와 N대N일 경우의 방식이 조금 다름.
-1대1과 1대N 관계일 때는 테이블 간의 외래키 방식과 동일.
---Order 클래스에 Member 클래스를 외래키처럼 추가.
그냥 추가하는게 아니라 AggregateReference 클래스로 Member 클래스를 한 번 감싸줌.
이렇게 하면 애그리거트 루트 간의 직접적인 객체 참조가 아닌 ID 참조가 이루어짐.
private AggregateReference<Member, Long> memberId;
-N대N 관계일 때는 외래키 방식인 ID 참조와 객체 참조 방식이 함께 사용.
(1대N, N대 1의 관계를 CoffeeRef 같이 중간에서 ID를 참조하게 해주는 클래스를 통해 다시 1대N대1의 관계로 변경)
Order 클래스에 추가
@MappedCollection(idColumn = "ORDER_ID", keyColumn = "ORDER_COFFEE_ID")
private Set<CoffeeRef> orderCoffees = new LinkedHashSet<>();
Order 클래스와 Coffee 클래스가 N대N 관계이기 때문에 N대N 관계를 1대N, N대1 관계로 풀어줄 엔티티가 중간에.
그게 CoffeeRef 클래스, 이 엔티티가 Order 클래스와 동일한 애그리거트 내에, 동일한 애그리거트 내에서는 객체 참조.
+Set<CoffeeRef>를 통해 Order 클래스와 ‘주문커피정보’ 엔티티 역할을 하는 CoffeeRef 클래스와 1대N의 관계를 만든다.
(idColumn 애트리뷰트는 자식 테이블에 추가되는 외래키에 해당되는 컬럼명을 지정)
(keyColumn 애트리뷰트는 외래키를 포함하고 있는 테이블의 기본키 컬럼명을 지정)
+CoffeeRef 클래스와 Coffee 클래스 간에 N대1의 관계를 만들어야.
@Getter
@AllArgsConstructor
// (1)기본적으로 클래스명이 테이블의 이름과 매핑.
//그래서 애너테이션 추가해서 테이블 이름 변경
@Table("ORDER_COFFEE") (1)
public class CoffeeRef {
private long coffeeId; // (2)
private int quantity; // (3)
}
애그리거트 간의 매핑 규칙을 따르기 때문에 Member 클래스와 Order 클래스에서 했던 것처럼 AggregateReference로 coffeeId를 감싸야 될 것 같지만 N 대 N 관계에서는 AggregateReference로 coffeeId를 감쌀 필요가 없음.
'부트캠프 TIL' 카테고리의 다른 글
23.01.13 쿠키 옵션 (0) | 2023.01.13 |
---|---|
22.12.28 JPA 방식 엔티티 간의 연관 관계 매핑 (1) | 2022.12.29 |
22.12.21 Section3 spring MVC 예외처리 (0) | 2022.12.21 |
22.12.14 throw throws 참고 링크 (0) | 2022.12.14 |
22.12.14 pointcut 표현식 참고 링크 (0) | 2022.12.14 |