🖊 Entity 타입
- @Entity로 정의하는 객체
- 데이터가 변해도 식별자로 지속해서 추적 가능
🖊 값 타입
- 자바 기본 타입이나 객체
- 식별자가 없고 값만 있으므로 변경시 추적 불가
- 생명주기를 Entity에 의존
🖊 값 타입의 분류
기본값 타입
임베디드 타입(embedded type, 복합 값 타입)
@Entity
public class Member{
@Id
private String id;
private String name;
...
// 기간은 다른 Entity에서 중복되서 빼고싶다.
private LocalDateTime startDate;
private LocalDateTime endDate;
...
↓
//기본 생성자 필수
@Embeddable
public class Period{
private LocalDateTime startDate;
private LocalDateTime endDate;
}
@Entity
public class Member{
@Id
private String id;
private String name;
...
// BaseEntity처럼 상속하는게 아님
@Embedded
private Period period;
...
- 새로운 값 타입을 직접 정의할 수 있다.
- 객체지향스럽게 재사용하는 것이 목적이며 사용 전 후로 DB 테이블에 영향이 없다.
- 따로 클래스를 빼두면서 활용할 여지가 늘어 좀 더 세밀하게 DB와 매핑할 수 있다.
- 여러 Entity에서 공유하면 side effect가 발생해서 위험하다.
(참조를 전달하는 객체 타입의 한계)
- 생성 시점 이후로 절대 값을 변경할 수 없는 객체로 만들어야한다. (ex String, Integer)
🖊 값 타입 컬렉션
- 값 타입을 하나 이상 저장할 때 사용
- 엔티티와 1 : 다 개념이 되어 DB에선 테이블을 따로 빼내야한다.
- 값 타입이기 때문에 식별자가 없으므로 모든 필드가 PK다.
- 영속성 전이, 고아 객체 제거 기능을 필수로 가진다.(생명주기 종속)
- default로 지연 로딩 전략을 사용한다.
...
@Embedded
@CollectionTable(name = "FAVORITE_FOOD", joinColumns =
@JoinColumn(name = "Parent_ID"))
private Set<String> favoriteFoods = new HashSet<>();
...
🤔 값 타입 컬렉션과 연관 Entity?
연관 Entity에 cascade를 ALL로 설정하고 orphanRemover를 true로하면
값 타입 컬렉션과 차이점은 식별자가 있냐 없냐만 남기 때문에 값 타입 컬렉션을 써야 할 이유가 있을까?
라고 써놨는데 값 타입 컬렉션 대신에 그냥 일대다 관계 Entity를 고려하는게 낫다고 한다.
식별자가 없어서 update 쿼리를 쓰고 싶을 때 치명적인 결함이 발생할 수 있기 때문에
연관 Entity안에 값 타입 컬렉션을 넣어서 처리하는 것을 권장한다.
값 타입 컬렉션은 update를 쓸 필요성이 없을 때와 같은 단순한 상황에서 쓰는 것을 권장한다.