본문 바로가기

JPA

2월 9일 JPA 값 타입을 엔티티로 승급

Member에서

@ElementCollection

@CollectionTable(name = "Address" , JoinColumn = @JoinColumn(name = "Member_ID"));

//name = "Address" : 생성될 테이블 명

//JoinColumn = @JoinColumn(name = "Member_ID") : fk 와 pk 로 연결할 컬럼

private List<Address> addressHistory = new ArrayList()<>;

위 처럼 값타입 컬렉션을 쓰던것을

 

@Entity

@Table(name = "address")

public class AddressEntity;

//엔티티 클래스를 생성후 

 

@OneToMany(cascade = CascadeType.All ,orphanRemoval = true) 

//@OneToMany 다대일 관계

//cascade = CascadeType.All : 영속성 존속

//orphanRemoval = true : 고아객체 처리

@JoinColumn(name = "Member_ID")

private List<addressEntity> addressHistory = new ArrayList<>();

 

값타입 컬렉션 대신 엔티티 컬렉션을 사용한다

이렇게 되면 엔티티 이기 때문에 고유의 식별자 PK가 생겨서 변경삭제가 용이하고

변경삭제시 모두 삭제후 남은값 넣기의 문제점이 해결된다.

엔티티이기 때문에 값 추적이 가능해진다,

 

그럼 값타입 컬렉션은 언제쓰나

값을 추적할 필요 없는 단순한 로직에 사용

 

엔티티 타입의 특징

-식별자가 있다

-생명주기가 관리된다.

-공유 된다.

 

값타입의 특징

-식별자가 없다

-생명주기를 엔티티에 의존한다.

-공유되지 않는것이 안전하다 (복사해서사용)

-불변객체를 만드는것이 안전

 

값타입은 정말 값타입이라 판단 될때만 사용

엔티티와 값타입을 혼동해서 엔티티를 값타입으로 만들면 안된다.

 

식별자가 필요하고 지속해서 값을 추적 , 변경해야한다면 그것은 값타입이 아니라 엔티티가 적합하다.

 

결론 값타입은 단순한 구조일때 사용하고 엔티티를 사용하자 

<값타입 컬렉션>

@ElementCollection

@CollectionTable(name = "Address" , JoinColumn = @JoinColumn(name = "Member_ID"));

private List<Address> addressHistory = new ArrayList()<>;

//구조가 단순할 때 사용

 

<컬렉션을 가진 엔티티>

@Entity

@Table(name = "address")

public class AddressEntity;

 

@OneToMany(cascade = CascadeType.All ,orphanRemoval = true) 

@JoinColumn(name = "Member_ID")

private List<addressEntity> addressHistory = new ArrayList<>();

//일반적으로 컬렉션 형태의 필드가 필요할땐 이 형태를 사용