본문 바로가기
[JAVA]/JPA

JPA - 값 타입

by 팡펑퐁 2023. 4. 20.
728x90

JPA의 데이터 타입 분류

엔티티 타입

  • @Entity로 정의하는 객체를 뜻한다.
  • 데이터가 변해도 식별자로 지속해서 추적할 수 있다.
    • ex) 회원 엔티티의 키나 나이를 변경해도 식별자로 인식이 가능하다.

 

값 타입

  • int, Integer, String처럼 단순히 값으로 사용하는 자바의 기본 타입이나 객체를 뜻한다.
  • 식별자가 없고 값만 있으므로 변경 시에 추적할 수 없다.
    • ex) 100 -> 200으로 변경 시 완전히 다른 값으로 대체되는 것을 의미한다.
  • 생명주기를 엔티티에 의존한다.
  • 공유하지 않는 것이 안전하다.
  • 불변 객체로 만드는 것이 안전하다.

 

 

값 타입 분류

기본값 타입(primitive type)

  • 자바기본타입(int, double, String 등)
  • 생명주기를 엔티티에 의존한다.
    • ex) 회원을 삭제하면 이름, 나이 필드도 함께 삭제된다.
  • 값타입은 공유하면 안된다.
    • ex) 특정 회원의 이름을 변경하려고 하는데 다른 회원의 이름도 함께 변경되는 것은 문제가 있다.
  • int, double 같은 기본 타입은 절대 공유되지 않는다.
  • 기본 타입은 항상 값을 복사한다.
  • Integer 같은 래퍼클래스나 String 같은 특수한 클래스는 공유가능한 객체이지만 변경할 수 없다.

 

 

임베디드 타입(embedded type, 복합 값 타입)

  • 새로운 값 타입을 직접 정의할 수 있다.
  • JPA는 이를 임베디드 타입이라고 한다.
  • 주로 기본값 타입을 모아 만들기 때문에 복합 값 타입이라고도 한다.
  • int, String과 같은 값 타입이다.
  • @Embeddable
    • 값 타입을 정의하는 곳에 표시한다.
  • @Embedded
    • 값 타입을 사용하는 곳에 표시한다.
  • 기본 생성자가 필수로 정의되어 있어야 한다.
  • 장점
    • 재사용할 수 있다.
    • 높은 응집도를 가진다.
    • 해당 값 타입만 사용하는 의미있는 메서드를 만들 수 있다.
    • 임베디드 타입을 포함한 모든 값 타입은 값 타입을 소유한 엔티티에 생명주기를 의존한다.

 

 

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

  • 임베디드 타입은 엔티티의 값일 뿐이다.
  • 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
  • 객체와 테이블을 아주 세밀하게 매핑하는 것이 가능하다.
  • 잘 설계한 ORM 애플리케이셔느은 매핑한 테이블의 수보다 클래스의 수가 더 많다.

 

@AttributeOverride

  • 속성을 재정의하는 애너테이션이다.
  • 한 엔티티에서 같은 값 타입을 사용하면 컬럼명이 중복되므로 컬럼명 속성을 재정의하는데 사용한다.

 

임베디드 타입과 null

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

 

 

컬렉션 값 타입(collection value type)

  • 값 타입을 하나 이상 저장할 때 사용한다.
  • @ElementCollection, @CollectionTable을 사용한다.
  • 데이터베이스는 컬렉션 같은 테이블에 저장할 수 없어 컬렉션을 저장하기 위한 별도의 테이블이 필요하다.

 

 

값 타입의 비교

동일성(identity) 비교

  • 인스턴스의 참조 값을 비교한다.
  • == 사용

동등성(equivalence) 비교

  • 인스턴스의 값을 비교한다.
  • equals() 사용
  • 값 타입은 a.equals(b)를 사용해서 동등성 비교를 해야한다.
  • 값 타입의 equals() 메서드를 적절하게 재정의해서 사용한다.

 

 

주의해야 할 사항

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

 

 

 

참고

김영한 - 자바 ORM 표준 JPA 프로그래밍

728x90