값 타입

Timo·2021년 4월 19일
0
post-thumbnail

김영한님의 <자바 ORM 표준 JPA 프로그래밍> 책을 정리한 내용입니다.

값 타입은 다음 세 가지로 나눌 수 있다.

  • 기본값 타입(basic value type)
  • 임베디드 타입(embedded type) - 복합 값 타입
  • 컬렉션 값 타입(collection value type)

기본값 타입

기본값 타입은 자바가 제공하는 기본 데이터 타입이다.

임베디드 타입(복합 값 타입)

임베디드 타입은 JPA에서 사용자가 직접 정의한 값 타입이다.

정의할 때는 값 타입의 클래스에 @Embeddable 어노테이션을 명시하여 정의한다.
엔티티 내부에서는 @Embedded 어노테이션을 명시하여 사용한다.

하이버네이트는 임베디드 타입을 컴포넌트(components)라고 한다.

값 타입과 불변 객체

값 타입 공유 참조

임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다.
값 타입은 객체 타입이며 값으로 참조 값을 저장하기 때문에 같은 인스턴스를 참조하게 된다.
공유 대신에 값(인스턴스)을 복사해서 사용해야 한다.

불변 객체(immutable Object)

값 타입은 될 수 있으면 불변 객체로 만들어 값을 수정할 수 없도록 강제해야 한다.
ex. 생성자로 초기 값을 설정하고 Setter를 만들지 않는다.

값 타입의 비교

값 타입 비교를 위해선 equals() 메서드와 hashCode() 메서드를 재정의해야 의도한대로 비교가 된다.

값 타입 컬렉션

값 타입을 하나 이상 저장하려면 컬렉션에 보관하고 @ElementCollection과 @CollectionTable 어노테이션을 사용하면 된다.

데이터베이스의 테이블은 컬럼 안에 컬렉션을 포함할 수 없다.
따라서 별도의 테이블을 추가하고 @CollectionTable를 사용해서 추가한 테이블을 매핑해야 한다.

값 타입 컬렉션은 영속성 전이 + 고아 객체 제거 기능을 필수로 가진다고 볼 수 있다.

JPA 구현체들은 값 타입 컬렉션에 변경 사항이 발생하면
값 타입 컬렉션이 매핑된 테이블의 연관되 데이터를 삭제하고, 현재 값 타입 컬렉션 객체이 있는 모든 값을 데이터베이스에 다시 저장한다.

profile
나는 매일 성장하는 사람

0개의 댓글