@ElementCollection은 엔티티의 필드가 기본값(Primitive Type, Wrapper Class) 또는 Embeddable 타입(내장 타입)인 컬렉션일 경우, 이를 별도의 테이블에 저장하기 위해 사용된다.
일반적으로 단순 값 타입의 리스트(Set, List, Map 등)를 저장할 때 유용하다.
별도의 엔티티(Entity) 없이 컬렉션을 테이블에 저장 가능
@OneToMany와 달리 FK를 가지는 별도 엔티티를 만들지 않아도 됨
기본값 타입(예: String, Integer)이나 @Embeddable 타입과 함께 사용 가능
컬렉션 데이터를 저장하는 테이블을 직접 지정하지 않으면 기본적으로 {엔티티명}_{컬렉션필드명} 형태로 자동 생성됨
@CollectionTable은 @ElementCollection이 적용된 컬렉션 데이터를 저장할 테이블을 명시할 때 사용된다.
import jakarta.persistence.*;
import java.util.List;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ElementCollection // 값 타입 컬렉션
@CollectionTable(name = "user_addresses", joinColumns = @JoinColumn(name = "user_id"))
@Column(name = "address") // 컬럼명 지정
private List<String> addresses;
// Getter, Setter
}
import jakarta.persistence.*;
@Embeddable
public class Address {
private String city;
private String street;
// 기본 생성자, Getter, Setter
}
import jakarta.persistence.*;
import java.util.List;
@Entity
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ElementCollection
@CollectionTable(name = "customer_addresses", joinColumns = @JoinColumn(name = "customer_id"))
private List<Address> addresses;
// Getter, Setter
}
@Entity
public class User {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "user") // User(1) → Post(N) 관계
private List<Post> posts = new ArrayList<>();
}
@Entity
public class Post {
@Id @GeneratedValue
private Long id;
private String title;
@ManyToOne // 반대편에서 ManyToOne 관계 설정
@JoinColumn(name = "user_id")
private User user;
}
• User(1) - Post(N) 관계이므로 @OneToMany 사용
• mappedBy = "user" → 연관 관계의 주인은 Post.user 필드
• Post 엔티티에서 @ManyToOne을 사용해 User를 참조함
@ElementCollection: 값 타입 컬렉션을 저장할 때 사용
@CollectionTable: 컬렉션을 저장할 테이블을 명시할 때 사용
@OneToMany와는 다르게 별도의 엔티티 없이 컬렉션 테이블을 생성
컬렉션 데이터 변경 시 성능 이슈가 있을 수 있으므로, 자주 변경되는 데이터는 @OneToMany가 더 적절