[JPA] 값 타입 컬렉션(JPA 기본편 by 김영한)

su_y2on·2022년 2월 1일
0

JPA

목록 보기
13/17
post-thumbnail

값 타입 컬렉션

값 타입 컬렉션을 값타입을 여러 개 저장해야할 때 사용합니다. 예를 들어 앞서 봤던 예제에서 Member마다 Period를 여러개 저장해야한다던가 여러 Address를 가지는 경우입니다.



만약 Member마다 여러개의 선호 음식을 갖는다고 하면 다음과 같이 만들어 줄 수 있습니다. 이때 joinColumns에는 FK로 쓸 값을 넣어줍니다. 임베디드 타입과는 다르게 컬렉션을 위한 테이블이 만들어집니다. 식별자는 모든 컬럼의 PK의 조합이 됩니다.

 @ElementCollection
 @CollectionTable(name = "FAVORITE_FOOD", joinColumns = @JoinColumn(name = "MEMBER_ID"))
 @Column(name = "FOOD_NAME")
 private Set<String> favoriteFoods = new HashSet<>()
 ;




동작 특징

1. 지연로딩

Member을 가져올 때 FAVORITE FOOD는 프록시 객체로 들어오며 실제로 쓰일 때 쿼리가 날라갑니다.

2. 수정 시 번거로움

먼저 수정을 하기 위해서는 지우고 새로운 것을 가져다가 넣어야합니다. 지금 Favorite food는 자료형이 Set이기때문에 최적화가 되어있어서 delete쿼리하나와 insert하나가 나가지만 그렇지 않은 다른 자료형(List..)이었다면 전부 지워지고 남은 것들이 다시 추가됩니다. 예를 들어 기존에 3개가 있었고 1개를 지우고 1개를 넣는다면 delete 전체삭제 쿼리 + insert 3개가 나갑니다. 이렇게 하는 이유는 식별자가 PK가 조합으로 이뤄져있어서 조회가 매우 번거롭기 때문입니다.

Member findmember = em.find(Member.class, member.getId()); 

findmember.getFavoriteFoods().remove("치킨");
findmember.getFavoriteFoods().add("한식");



결론 : 간단한 경우가 아니라면 일대다 관계로 만들어주자! 즉 엔티티로 승격 + CASCADE + 고아객체제거

0개의 댓글