[3] JPA 프로그래밍 (12) - JPA 데이터 타입 2 (값 타입 컬렉션 / Entity 승격)
값 타입 컬렉션
[ 설명 ]
값 타입
을 컬렉션(List, Set)
에 담아서 쓰는 변수
RDB
에는 다수의 데이터
를 하나로 저장하는 구조가 없다
--> 테이블로 따로 분리해야 함 (1:N관계)
[ 사용 ]
Member
객체에 값 타입 컬렉션
2개를 추가 (favoriteFoods
/ addressHistory
)
@ElementCollection
: 값타입 컬렉션임을 알리는 어노테이션
@CollectionTable
: 새로 생길 테이블
지정 & joinColumn
지정
[ 저장 ]
- 중요한 것!
: 값 타입 컬렉션
을 따로 em.persist()
해주지 않아도 내부적으로 처리된다!
값타입 컬렉션
은 영속성 전이(cascade)
+ 고아 객체 제거 기능(orphanRemoval)
을 필수로 가짐
[ 조회 ]
- 조회할때 단순
embedded 타입
은 바로 조회된다(embedded type
은 DB
관계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)