공부기록/TIL

2022/12/23 TIL | Spring Data JDBC (2)

또리머 2022. 12. 23. 19:33
반응형

💭 오늘의 학습 전략

# 도메인 엔티티 및 테이블 설계

◻️ DDD (Domain Driven Design)

 ◽Aggregate

 ◽Aggregate Root

◼️설계

# 데이터 액세스 계층 구현

◻️ AggregateReference

◻️ 애그리거트 객체 매핑 규칙

◼️ 실습

🌼 학습한 것들

◾ Aggregate

 ▪️ 비슷한 업무 도메인 묶음

 Aggregate Root

 ▪️ Aggregate를 대표하는 도메인

 ▪️ 선정 기준: 다른 도메인과 직, 간접적으로 연관된 도메인

  - Aggregate Root의 PK (Primary Key)를 다른 도메인이 FK로 가지고 있다.

◾설계

 ▪️ 데이터베이스 테이블 간의 관계는 외래키를 통해

 ▪️ 클래스 간의 관계는 객체의 참조를 통해

 ▪️ N:N 관계는 1:N, N:1로 재설계 (참조 테이블 객체)

◾Aggregate 객체 매핑 규칙

 ▪️ 모든 Entity 객체의 상태는 Aggregate Root 통해서만 변경

  - 도메인 규칙의 일관성 유지

 ▪️ 동일한 Aggregate 내에서는 Entity 간 객체 참조

 ▪️ Aggregate Root 간의 참조는 Id 참조

  - 1:1, 1:N => 외래키 방식(AggregateReference)

  - N:N => Id 참조 + 객체 참조 (1:N, N:1로 재설계)

    참조할 테이블에 해당되는 클래스의 @Id 필드를 멤버 변수로 가지는 별도의 참조 클래스 사용

◾AggregateReference

 ▪️ 서로 다른 애그리거트 루트 간의 참조 역할

 ▪️ 다른 객체의 Id 참조할 수 있도록 해준다. (외래키 역할)

◾@MappedCollection (idColumn="외래키", keyColumn="외래키 포함 테이블 기본키")

@Getter
@Setter
@Table("ORDERS")
public class Order {
    @Id
    private long orderId;
    
    private AggregateReference<Member, Long> memberId;
	
    @MappedCollection(idColumn = "ORDER_ID", keyColumn = "ORDER_COFFEE_ID")
    private Set<CoffeeRef> orderCoffees = new LinkedHashSet<>();
    
    // ...
}

MEMBER : ORDER = 1 : N

ORDER : COFFEE  = N : N (ORDER_COFFEE: 참조 테이블)

🔥 보충이 필요한 것들

AggregateReference와 @MappedCollection

 

 

💨 하루를 마치며

1. AggregateReference로 서로 다른 애그리거트 루트 간의 참조 역할을 하기 때문에 CoffeeRef와 Coffee를 매핑할 때 AggregateReference로 coffeeId를 감싸주지 않는 게 맞는지 궁금했다.

2. Service를 만들 때 커피 등록 기능에서, 등록하기 전에 toUpperCase()로 대문자 변환을 하고 시작하는데 이것도 하나의 기능으로 보고 메서드를 따로 빼는 게 가능한지(?) 궁금했다.

3. 처음보는 단어와 개념이 많아서 혼란스러운 하루였다.

4. 실습하는데 오류가 계속 떠서 힘들었다ㅠ DbActionExecutionException, @Param 에러 등,,,  @NoArgsConstructor (기본 생성자)가 꼭 필요할 때는 아직도 잘 이해가 안 된다. 웬만하면 작성하는 걸 습관화하는 게 좋다고는 한다...

5. 월요일은 휴가를 사용했다. 흐름이 끊기지 않게 잘 해야겠다........

반응형