해당 포스팅은 사이드 프로젝트 진행 중 겪은 크고 작은 이슈들에 대한 기록입니다.
ElemenctCollection
이라고 한다.@Entity
public class Store extends BaseEntity {
// ...
@ElementCollection(fetch = FetchType.LAZY) // default: LAZY라 사실 명시할 필요없음
private List<String> offDays = new ArrayList<>();
// ...
}
위처럼 @ElementCollection 애노테이션만 붙여주면 해당 필드가 Collection이라는 것을 알게 되고, RDB에서 이 필드를 관리할 별도의 테이블을 생성해준다.
함께 @CollectionTable을 사용하여 매핑할 테이블의 정보를 직접 설정해줄 수도 있다.
보다싶이 애노테이션 하나 혹은 둘 만으로 RDB가 다루지 못하는 Colleciton 형태의 데이터를 쉽게 처리할 수 있게 도와주는 편리한 기능이다.
하지만 ElementCollection은 문제점을 몇가지 가지고 있고, 나 또한 이를 사용하면서 해당 문제들로 인한 성능 개선의 필요성을 크게 느꼈기에 ElementCollection을 대체하고자 한다.
식별자
가 존재하지 않기 때문에 값이 변경되는 경우, 이를 추적하는 것이 어렵다.@Entity
public class Store extends BaseEntity {
// ...
// Days (N:N)
@OneToMany(mappedBy = "store")
private List<DaysOfStore> daysOfStoreList = new ArrayList<>();
// ...
}
@Entity
public class DaysOfStore {
@Id
@GeneratedValue
@Column(name = "days_of_store_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "days_id")
private Days days;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "store_id")
private Store store;
// ...
}
@Entity
public class Days {
@Id
@GeneratedValue
@Column(name = "days_id")
private Long id;
@Enumerated(EnumType.STRING)
private DaysType days;
@OneToMany(mappedBy = "days")
private List<DaysOfStore> daysOfStoreList = new ArrayList<>();
// ...
}