Close
Close full mode
logo만렙 개발자 키우기

(6) 정리

Git RepositoryEdit on Github
Last update: 9 months ago by nowwaterReading time: 2 min

엔티티 타입의 특징

1. 식별자(@Id) 가 있다.

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

2. 생명 주기가 있다.

  • 생성하고, 영속화하고, 소멸하는 생명 주기가 있다.
  • em.persist(entity) 로 영속화
  • em.remove(entity) 로 제거

3. 공유할 수 있다.

  • 참조 값을 공유할 수 있다 => 공유 참조

값 타입의 특징

1. 식별자가 없다.

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

  • 스스로 생명주기를 갖지 않고, 엔티티에 의존한다. 의존하는 엔티티 제거 시 같이 제거된다.

3. 공유하지 않는 것이 안전하다.

  • 엔티티 타입과는 다르게 공유하지 않는 것이 안전하다. 대신 값을 복사해서 사용해야 한다.
  • 오직 하나의 주인만이 관리해야 한다.
  • 불변 객체로 만드는 것이 안전하다.

값 타입은 정말 값 타입이라 판단될 때만 사용해야 한다. 식별자가 필요하고 지속해서 값을 추적하고 구분하고 변경해야 한다면, 그것은 값 타입이 아닌 엔티티다.

지금까지 정리를 하자면 일단 값 타입은 VO(Value Object) 라고 부른다.

값 타입엔 기본 값 타입과, 임베디드 값 타입, 컬렉션 값 타입이 존재한다.

  1. 기본 값 타입은 자바에서 제공하는 원시 타입(기본 타입, 객체)을 사용하는 값이다.

  2. 임베디드 값 타입은 여러 속성을 갖도록 직접 만들 수 있고, 원래 엔티티에는 값 타입을 매핑시켜서 사용할 수 있다.

  3. 값 타입 컬렉션은 값 타입의 특성상 식별자가 없어서 수정이 발생했을 때 원본 데이터를 찾기가 어려워진다는 단점이 있다.

  • 그래서 수정 시 임베디드 값 타입에 매핑되는 테이블의 전체 데이터를 싹 다 지우고, 컬렉션에 있는 데이터를 새롭게 다시 추가하는 방법을 사용한다.

  • 이 방법은 데이터가 많고, 자주 수정이 발생한다면 매우 비효율적일 것 같다. 따라서 그런 경우엔 일대다 매핑을 통해서 컬렉션으로 갖는게 나아 보인다.

값 타입 비교를 위해선 equals()hashCode()를 재정의해서 모든 필드값을 비교하도록 구현해야 한다.

🚀 JPA — Previous
(5) 값 타입 컬렉션
Next — 🚀 JPA
10장. 객체지향 쿼리 언어