본문 바로가기
JPA & Hibernate

JPA 값 타입

by Salt-Fn 2023. 3. 10.

인프런의 자바 ORA 표준 JPA 프로그래밍 - 기본편과 자바 ORM 표준 JPA 책을 공부하며 정리한 포스트입니다

 

 JPA의 데이터 타입은 크게 엔티티 타입과 값 타입으로 나눌 수 있다. 엔티티 타입은 @Entity로 정의하는 객체, 값 타입은 int, Integer, String 같은 자바 기본타입이나 객체를 말한다.

 엔티티 타입은 식별자를 통해 지속해서추적할 수 있지만, 값 타입은 식별자가 없고 숫자나 문자같은 속성만 있으므로 추적할 수 없다.

  • 기본값 타입
     - 자바 기본 타입 (예: int, double...)
     - 래퍼 클래스 (예: Integer)
     - String
  • 임베디드 타입 embedded type (복합 값 타입)
  • 컬렉션 값 타입 Collection value type

기본값 타입

위 엔티티에서 String과 int가 값 타입이다. Member 엔티티는 id라는 식별자 값도 가지고 생명주기도 있지만 값 타입인 name, age 속성은 식별자도 없고 생명주기 또한 회원 엔티티에 의존한다. 그리고 값 타입은 공유하면 안된다.

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

새로운 값 타입을 직접 정의해서 사용할 수 있는데, JPA에서는 이것을 임베디드 타입이라 한다. 직접 정의한 임베디드 타입도 값 타입이다.

  • @Embeddable: 값 타입을 정의하는 곳에 표시
  • @Embedded: 값 타입을 사용하는 곳에 표시

임베디드 타입은 기본 생성자가 필수다.

임베디드 타입을 포함한 모든 값 타입은 엔티티의 생명주기에 의존하므로 엔티티와 임베디드 타입의 관계를 UML로 표현하면 컴표지션 관계가 된다.

임베디드 타입의 장점

  • 재사용
  • 높은 응집도
  • 해당 값 타입만 사용하는 의미 있는 메소드를 만들 수 있음.
  • 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명주기를 의존함.

 

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

임베디드 타입과 테이블 매핑

임베디드 타입은 엔티티의 값일 뿐이다. 따라서 값이 속한 엔티티의 테이블에 매핑한다. 

임베디드 타입과 연관관계

임베디드 타입은 값 타입을 포함하거나 엔티티를 참조할 수 있다.

@AttrubuteOverride: 속성 재정의

임베디드 타입에 정의판 매핑정보를 재정의하려면 엔티티의 @AttributeOverride를 사용하면 된다.

임베디드 타입과 null

임베디드 타입이 null이면 매핑한 컬럼 값은 모두 null이 된다.

값 타입과 불변 객체

값 타입 공유 참조

임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면  부작용(side effect)이 발생할 수 있다. 

값 타입 복사

값 타입의 실제 인스턴스인 앖을 공유하는 것은 위험하고 대신에 값을 복사(entity.clone()...)해서 사용해야 한다.

불변 객체

부작용이 일어나면 값 타입이라 할 수 없다. 객체를 불변하게 만들면 값을 수정할 수 없으므로 부작용을 원천 차단할 수 있다. 따라서 값 타입을 될 수 있으면 불변 객체로 설계해야 한다. 불변 객체의 값은 조회할 수 있지만 수정할 수 없다. 불변 객체도 결국은 객체이므로 인스턴스의 참조 값 공유를 피할 수 없지만 인스턴스의 값을 수정할 수 없으므로 부작용이 발생하지 않는다.

값 타입의 비교

자바가 제공하는 객체 비교 2가지

  • 동일성(Identity) 비교: 인스턴스의 참조 값을 비교, == 사용
  • 동등성(Equivalence) 비교: 인스턴스의 값을 비교, equals() 사용

Address 값 타입을 a==b로 동일성 비고하면 서로 다른 인스턴스이므로 결과는 false가 나온다. 값 타입을 비교할 때는 a.equals(b)를 사용해서 동등성 비교를 해야 한다.

값 타입 컬렉션

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

 

'JPA & Hibernate' 카테고리의 다른 글

JPA 프록시와 연관관계 관리  (0) 2023.03.06
JPA 고급 매핑  (0) 2023.03.03
JPA 다양한 연관관계 매핑  (0) 2023.02.27
JPA 연관관계 매핑 기초  (0) 2023.02.23
JPA 엔티티 매핑  (0) 2023.02.22