본문 바로가기
Back-End/JPA

JPA) 값 타입 컬렉션 vs @OneToMany

by 어렵다어려웡 2022. 3. 12.

엔티티 는 식별자가 있어서 엔티티의 값을 변경해도 식별자로 DB에 저장된 원본 데이터를 쉽게 찾아서 변경 할 수 있다.

 

반면 값 타입은 식별자라는 개념이 없고 단순한 값들의 모음이므로 값을 변경해버리면

DB에 저장된 원본 데이터를 찾기어렵다.

 

JPA 구현체들은 값 타입 컬렉션에 변경사항이 생기면 값 타입 컬렉션과 관련된 데이터를 모두 삭제하고,

다시 현재 값 타입 컬렉션에 있는 데이터를 저장한다.

 

실무에서는 값 타입 컬렉션에 매핑된 데이터가 많으면 값 타입 컬렉션 대신 일대다 관계를 고려해야 한다.

 

추가로 값 타입 컬렉션을 매핑하는 테이블은 모든 컬럼을 묶어서 기본키로 구성해야 한다.

따라서 DB 기본 키 제약조건으로 인해 컬럼에 null 을 입력할 수 없고 같은 값을 중복해서 넣을 수 없는 제약도 있다.

 

이러한 문제들은 값 타입 컬렉션 대신에 새로운 엔티티를 만들어서 일대다 관계로 설정하면 된다.

 

여기에 추가로 영속성 전이 + 고아 객체 제거 기능을 추가하면 값타입 컬렉션 처럼 사용할 수 있다.

public class AddressEntity {
	
	@Id
	@GeneratedValue
	private Long id;

	@Embedded
	private Address address;

}
public class Member {

	@OneToMnany(cascade = CascadeType.ALL, orphanRemoval = true)
	@JoinColumn(name = "MEMBer_IOD")
	private List<AddressEntity> addressHsitory = new ArrayList<>)();

}

정리

  1. 엔티티 타입 의 특징
  • 식별자가 있다

엔티티 타입은 식별자가 있고 식별자로 구분할 수 있다.

  • 생명주기가 있다.

생성, 영속화, 소멸하는 생명 주기가 있다.

  • 공유할 수 있다.

참조 값을 공유한다. 이것을 공유 참조 라고 한다.

어떤 엔티티가 있으면 다른 엔티티에서 얼마든지 조회할 수 있다.

 

   2. 값 타입의 특징

  • 식별자가 없다.
  • 생명주기를 엔티티에 의존한다.
  • 공유하지 않는 것이 안전하다.

값을 복사해서 사용해야 한다.

오직 하나의 주인만이 관리해야 한다.

불변 객체로 만드는 것이 안전하다.

 

 

'Back-End > JPA' 카테고리의 다른 글

JPA) Spring OSIV  (0) 2022.03.14
JPA) 과거 방식의 OSIV  (0) 2022.03.13
JPA) 객체지향 쿼리  (0) 2022.03.12
JPA) 영속성 전이  (0) 2022.03.12
JPA) Eager, Lazy 로딩  (0) 2022.03.12