9장 값타입

JPA 에는 값타입, 엔티티 타입 으로 두가지 데이터 타입이 있다.

엔티티 타입

값 타입

  1. 기본값 타입 : id값(식별자 값)을 제외한 일반 컬럼 (ex. name, age), 공유 X

  2. 임베디드 타입

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

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

  • 임베디드 타입을 사용 전 후의 테이블은 동일하다. 다만 더 객체지향적으로 코드를 짤 수 있다는 장점이 있다.

  • 잘 설계된 ORM 애플리케이션은 매핑한 테이블 수 보다 클래스의 수 가 더 많다. 그렇지 않은 경우, 보통 테이블과 객체 1:1 이다.

  • 임베디드 타입은 값 타입은 물론, 엔티티도 참조할수있다.

해당 코드 처럼 따로 클래스를 만들어서 어노테이션으로 지정해주고 사용하려는 엔티티 에서도 어노테이션으로 지정 해주면 마치 하나의 다른 테이블을 컬럼화 시킨것처럼 사용할수있다.

만약 Address 가 아닌 좀 더 단순하고 추적, 변경이 잦지 않은 명시적 성향이 강한 데이터라면 정말 유용하게 사용할거 같다는 생각이 들었다. Address 는 수정은 잦지 않더라도 불러오는 횟수도 많고 주문로직에서 사용될 일도 많을거 같아 오히려 따로 테이블로 빼서 연관관계를 쥐어주는것이 옳은거같다.

  1. 컬렉션 값 타입

일반 값 타입에 컬렉션을 담아서 쓰는것을 의미한다. 하지만 RDB에는 내부적으로 컬렉션이 들어갈수없는 구조 이다. 그래서 보통 다대일 관계에서 일 쪽 엔티티에 해당 값타입을 설정해 후에 객체로 꺼내올때 해당 값타입을 사용한다.

  • 단점

  1. 엔티티는 식별자가 존재해서 데이터를 추적할수있지만 값타입은 변경이 쉽고 변경됬을때 원본 값을 따로 저장되는게 아니기에 추적이 어렵다.

  2. 컬렉션은 변경이 존재하면 모든 데이터를 삭제 후 다시 저장하는 비효율적인 사이클을 가졌다.

고로 실무에서 컬렉션 값 타입을 단독으로 쓰는 일은 많지 않을것 같다 느꼈다.

Last updated