ElementCollection과 Embeddable의 차이

값 타입 컬렉션이란?

값 타입 컬렉션은 JPA에서 엔티티가 아닌 값 타입(예: String, Integer, 혹은 @Embeddable로 정의된 클래스)들을 컬렉션(List, Set 등) 형태로 관리하는 기능입니다. 한 엔티티가 여러 개의 값 타입 데이터를 가질 때 사용됩니다.

주요 특징

  • 별도의 테이블에 저장: 컬렉션의 각 값은 엔티티의 기본키와 연관되어 저장됩니다.
  • 생명주기 의존: 부모 엔티티 삭제 시 컬렉션 데이터도 함께 삭제됩니다.
  • 활용 예시:
@ElementCollection
@CollectionTable(name = "holiday_type", joinColumns = @JoinColumn(name = "holiday_id"))
@Column(name = "type", length = 100")
private Set<String> types = new HashSet<>();

@ElementCollection과 @Embeddable의 차이

구분@ElementCollection@Embeddable
목적값 타입 컬렉션을 엔티티에 매핑값 타입(임베디드 타입) 정의
용도여러 개의 값 타입(혹은 임베디드 타입) 객체를 컬렉션으로 관리여러 필드를 하나의 값 타입으로 묶어 표현
테이블 구조별도의 컬렉션 테이블 생성엔티티 테이블에 필드가 합쳐져 저장
생명주기부모 엔티티에 종속부모 엔티티에 종속
예시List<Address>와 같이 여러 개 관리Address 한 개만 관리

예제 코드

단일 값 타입

@Embeddable
public class Address {
    private String city;
    private String street;
}
 
@Entity
public class Member {
    @Embedded
    private Address address;
}

컬렉션 값 타입

@Embeddable
public class Address {
    private String city;
    private String street;
}
 
@Entity
public class Member {
    @ElementCollection
    private List<Address> addressHistory = new ArrayList<>();
}

요약

  • @Embeddable은 값 타입을 정의하는 용도, @ElementCollection은 그 값 타입을 컬렉션으로 엔티티에 매핑할 때 사용합니다.
  • 값 타입 컬렉션은 별도의 테이블에 저장되며, 부모 엔티티와 생명주기를 함께 합니다.
  • 단일 값 타입은 @Embedded, 컬렉션 값 타입은 @ElementCollection을 사용합니다.