[코드로 배우는 스프링부트] Chapter7. 다대다 관계 설계와 구현

이용준·2023년 6월 7일
0
post-thumbnail

엔티티 (각각 독립적)

  • 영화(Movie) - 한 편의 영화는 여러 시청 회원이 존재한다.

  • + 영화 이미지(Image)

    • 영화 포스터 엔티티
    • UUID - UUID.randomUUID().toString()
      • 범용 고유 식별자 의미(각 개체를 고유하게 식별 가능한 값으로 생성)
      • 길이가 상당히 길어 DB에 많은 부하가 걸리게 되므로 임시 유저의 Key 값 주거나, 파일 업로드시 식별 위해 사용한다.
  • 회원(Member) - 여러 편의 영화 평가한다.

    • 실제 개념적으로 M:N 사용하는 경우 많으나 테이블로 설계 불가
      - 대안으로 매핑 테이블(교차 테이블) 사용
      - 매핑 테이블 : 두 테이블 중간에서 필요한 정보를 양쪽에서 끌어쓰는 구조
  • 리뷰(Review) - 매핑 테이블

    • @ManyToOne 적용
  • 매핑 테이블 특징
    - 작성 전 다른 테이블이 먼저 존재해야 함.
    - 동사 or 히스토리 에 대한 데이터 보관 용도
    - 중간에서 양쪽 PK 참조하는 형태로 사용


필요한 데이터 처리

@Query@EntityGraph or 서브쿼리 활용

  • 영화 100개, 이미지 파일 100개, 회원 100명, 리뷰 200개 작성했을때 아래와 같은 내용 필요
    • 목록(list)에서 영화 제목, 이미지 하나(썸네일), 리뷰 평점・갯수
    • 영화 조회(read) 화면에서 영화와 영화 이미지들, 리뷰 평균 점수와 갯수를 같이 출력
    • 리뷰 정보에서 회원의 이메일과 닉네임(nickname) 등의 정보 출력
  • @EntityGraph
    • 엔티티 특정한 속성 같이 로딩
    • 예) Review 처리할 때 Member 객체 로딩
    • JPA 이용시 연관 관계의 FATCH 속성 값은 LAZY로 지정하는 것이 일반적
     [@EntityGraph 속성]
      - attributePaths: 로딩 설정 변경할 속성 이름 배열({})로 명시
      - type : @EntityGraph를 어떤 방식으로 적용할 것인지 설정
      - FATCH - attributePaths 에 명시한 속성은 Eager,나머지는 Lazy 처리
      - LOAD - 명시한 속성은 Eager, 나머지는 엔티티 클래스에 명시
profile
뚝딱뚝딱

0개의 댓글