오늘은 간단하게 @ElementCollection에 대해 정리해볼려고 한다.
값 타입 컬렉션(Value Type Collection)
- 컬렉션(리스트, 세트, 맵 등) 내부에 단순한 값들을 저장하는 것을 의미
- 컬렉션을 사용하여 DB 테이블로 구현할 때 관계형 데이터 베이스는 기본적으로 테이블안에 컬렉션을 담을 수 없다.
-> 따라서 별도의 테이블을 만들어서 저장해야한다!!
@ElementCollection는 @CollectionTable를 사용한다.
예제 1
@Entity
public class User {
@Id @GeneratedValue
private Long id;
private String name;
// 기본 타입 컬렉션 예제
@ElementCollection
@CollectionTable(
name = "USER_FAVORITE_FOODS", // 컬렉션을 저장할 테이블 이름
joinColumns = @JoinColumn(name = "USER_ID") // 소유 엔티티(User)의 식별자와 연결될 FK 컬럼 지정
)
@Column(name = "FOOD_NAME") // String 타입의 값 컬렉션이므로 컬럼명 지정 가능
private Set<String> favoriteFoods = new HashSet<>();
// 임베디드 타입 컬렉션 예제
@ElementCollection
@CollectionTable(
name = "USER_ADDRESS_HISTORY",
joinColumns = @JoinColumn(name = "USER_ID")
)
private List<Address> addressHistory = new ArrayList<>();
}
-> @CollectionTable을 통해 지정한 이름(USER_FAVORITE_FOODS, USER_ADDRESS_HISTORY)의 테이블이 생성되며,
이 테이블은 소유 엔티티의 식별자(USER_ID)를 외래 키로 사용해 연관관계를 맺는다.