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
'[JAVA] > JPA' 카테고리의 다른 글
JPQL - 프로젝션 (0) | 2023.05.01 |
---|---|
JPA가 지원하는 다양한 쿼리 방법(JPQL, QueryDSL 등) (0) | 2023.04.22 |
JPA - 영속성 전이: CASCADE와 고아 객체 (0) | 2023.04.17 |
JPA - 즉시 로딩과 지연 로딩 사용시 주의할 점 (0) | 2023.04.17 |
JPA - 프록시(Proxy) (0) | 2023.04.17 |