[3] JPA 프로그래밍 (12) - JPA 데이터 타입 2 (값 타입 컬렉션 / Entity 승격)

김정욱·2021년 3월 9일
0

[3] JPA 프로그래밍

목록 보기
12/15
post-thumbnail

값 타입 컬렉션

[ 설명 ]

  • 값 타입컬렉션(List, Set)에 담아서 쓰는 변수
  • RDB에는 다수의 데이터를 하나로 저장하는 구조가 없다
    --> 테이블로 따로 분리해야 함 (1:N관계)

[ 사용 ]

  • Member 객체에 값 타입 컬렉션 2개를 추가 (favoriteFoods / addressHistory)
    • @ElementCollection : 값타입 컬렉션임을 알리는 어노테이션
    • @CollectionTable : 새로 생길 테이블 지정 & joinColumn 지정

[ 저장 ]

  • 중요한 것!
    : 값 타입 컬렉션을 따로 em.persist()해주지 않아도 내부적으로 처리된다!
  • 값타입 컬렉션영속성 전이(cascade) + 고아 객체 제거 기능(orphanRemoval)을 필수로 가짐

[ 조회 ]

  • 조회할때 단순 embedded 타입은 바로 조회된다(embedded typeDB 관계X)
  • 값타입 컬렉션은 지연로딩으로 설정된다(실제 table을 생성하기 때문)

[ 수정 ]

  • remove할 때 equals() 재정의가 반드시 필요
    --> 삭제할 요소를 찾을때 기본 equals()는 인스턴스를 비교해서 찾을 수 없게됨
    그래서 동등성 비교를 해야 찾아서 삭제할 수 있다.
  • 삭제하는 과정에서 생성되는 query를 살펴보면 값타입 컬렉션 의 제약사항을 볼 수 있음
    • (요청)MEMBER_ID 를 가진 데이터 하나를 삭제
      --> MEMBER_ID 관련 데이터 모두 삭제
      --> 삭제하는 요소를 제외한 나머지 데이터(원래 있던 값 + 새로 추가하는 값)을 전부 insert query로 날림
      --> 하나만 삭제하면 되는데 왜 다 delete하고 전부 다시 insert 할까?
      : 값타입 컬렉션식별자를 따로 보유하지 않아서 이렇게 동작
  • 결과적으로 값 타입 컬렉션은 실무에서 권장X
    --> Entity로 승격해서 1:N 단방향 or N:1 양방향 연관관계 해야함

정리

  • RDB에서 1:N관계는 무조건 테이블로 따로 분리해야 함
  • 값 타입 컬렉션은 실무에서 권장되지 않는다.
  • 대신, Entity 승격 +테이블 연관관계 + cascade + orphanRemoval 설정
    ex)
profile
Developer & PhotoGrapher

0개의 댓글