[JPA] 값 타입 컬렉션 제약사항과 대안적 접근 방법

값 타입 켈력선의 이해와 제약사항

  • 값 타입 컬렉션은 엔티티와 다르게 식별자를 가지지 않음.
  • 값 타입은 데이터 변경시 원본 데이터를 찾기가 힘듭니다.
  • 값 타입 컬렉션이 테이블에 저장되는 경우
    • 값의 변경이 있는 경우 원본 데이터를 갱신하기 힘들기에
    • JPA 구현체는 값 변경이 있는 경우
      • 변경된 데이터를 삭제하고 다시 저장함

실무에서의 값 타입 컬렉션 사용

  • 성능 문제로 인해 일대다 관계를 고려해야함
  • 또는 엔티티로 그냥 사용하는 방법도 있음

값 타입 컬렉션의 대안

  • 값 타입 컬렉션을 사용하는 것이 성능상에 문제가 있는 경우
    • 새로운 엔티티를 생성하여 일대다 관계로 설정하는 것이 한 가지 해결책
@Entity
@Setter
@Getter
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Embedded
    private Address homeAddress;
    
    // 문자열 집합을 테이블로 매핑
    @ElementCollection(fetch = LAZY)
    @CollectionTable(name = "FAVORITE_FOODS", joinColumns = @JoinColumn(name = "MEMBER_ID"))
    @Column(name = "FOOD_NAME") // 매핑할 컬럼 지정
    private Set<String> favoriteFoods = new HashSet<>();
    
    // 일대다로 임베디드타입을 감싸는 형태
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "MEMBER_ID")
    private List<AddressEntity> addressHistory = new ArrayList<>();
}

@Entity
class AddressEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Embedded
    private Address address;
}

@Embeddable
@AllArgsConstructor
@NoArgsConstructor
class Address {
    @Column
    private String city;
    private String street;
    private String zipcode;
}
  • 완성되는 테이블 구조

Uploaded by N2T

'자바 > JPA' 카테고리의 다른 글

[JPA] 값 타입 컬렉션  (0) 2023.11.09
[JPA] 값 타입 컬렉션 개요  (0) 2023.11.09
[JPA] 객체지향 쿼리  (0) 2023.11.09
[JPA] JPQL 소개  (0) 2023.11.09
[JPA] JPQL 의 기본 문법과 쿼리 API  (0) 2023.11.09