9장 값타입
JPA 에는 값타입, 엔티티 타입 으로 두가지 데이터 타입이 있다.
엔티티 타입
값 타입
기본값 타입 : id값(식별자 값)을 제외한 일반 컬럼 (ex. name, age), 공유 X
임베디드 타입
@Embeddable: 값 타입을 정의하는 곳에 표시@Embedded: 값 타입을 사용하는 곳에 표시임베디드 타입을 사용 전 후의 테이블은 동일하다. 다만 더 객체지향적으로 코드를 짤 수 있다는 장점이 있다.
잘 설계된 ORM 애플리케이션은 매핑한 테이블 수 보다 클래스의 수 가 더 많다. 그렇지 않은 경우, 보통 테이블과 객체 1:1 이다.
임베디드 타입은 값 타입은 물론, 엔티티도 참조할수있다.


해당 코드 처럼 따로 클래스를 만들어서 어노테이션으로 지정해주고 사용하려는 엔티티 에서도 어노테이션으로 지정 해주면 마치 하나의 다른 테이블을 컬럼화 시킨것처럼 사용할수있다.
만약 Address 가 아닌 좀 더 단순하고 추적, 변경이 잦지 않은 명시적 성향이 강한 데이터라면 정말 유용하게 사용할거 같다는 생각이 들었다. Address 는 수정은 잦지 않더라도 불러오는 횟수도 많고 주문로직에서 사용될 일도 많을거 같아 오히려 따로 테이블로 빼서 연관관계를 쥐어주는것이 옳은거같다.
컬렉션 값 타입
일반 값 타입에 컬렉션을 담아서 쓰는것을 의미한다. 하지만 RDB에는 내부적으로 컬렉션이 들어갈수없는 구조 이다. 그래서 보통 다대일 관계에서 일 쪽 엔티티에 해당 값타입을 설정해 후에 객체로 꺼내올때 해당 값타입을 사용한다.
단점
엔티티는 식별자가 존재해서 데이터를 추적할수있지만 값타입은 변경이 쉽고 변경됬을때 원본 값을 따로 저장되는게 아니기에 추적이 어렵다.
컬렉션은 변경이 존재하면 모든 데이터를 삭제 후 다시 저장하는 비효율적인 사이클을 가졌다.
고로 실무에서 컬렉션 값 타입을 단독으로 쓰는 일은 많지 않을것 같다 느꼈다.
Last updated