기본 값 타입들을 모아 새로운 타입으로 생성된 하나의 값 타입이며, 복합 값 타입이라고도 한다.
임베디드 타입은 int, String과 같은 기본 값 타입들을 포함한 클래스라고 볼 수 있다.
예를 들어 위와 같은 Member 테이블이 있다면, 하나의 범주로 묶을 수 있는 필드들을 아래와 같이 임베디드 타입으로 묶을 수 있다.
필드 개수가 줄어들어 테이블 구성이 간결해지고, 설계 측면에서도 더 자연스러워진다.
"회원 엔티티는 이름, 근무 시작일, 근무 종료일, 주소 도시, 주소
번지, 주소 우편번호를 가진다"
보다는
"회원 엔티티는 이름, 근무 기간, 집 주소를 가진다"
가 더 자연스럽고 간결하다
해당 값 타입만 사용하는 의미있는 메서드들을 효율적으로 생성하고 활용할 수 있다.
startDate
와 endDate
를 사용하여 근무기간을 구하는 메서드를 생성할 때, 임베디드 타입으로 분리하여 메서드를 생성/활용 한다면 훨씬 간결하게 코드를 작성할 수 있다.임베디드 타입 자체를 다른 엔티티에서 재사용할 수 있다.
회원의 주소
, 사업장 주소
등 다양한 곳에서 재사용될 수 있다.임베디드 타입(클래스)에 @Embeddable
을 붙여주거나, 임베디드 타입이 사용되는 곳(필드)에 @Embedded
를 붙여준다.
둘 중 하나만 해줘도 되지만, 두 가지 작업 모두 하는 것이 좋다.
임베디드 타입
은 엔티티의 값일 뿐이다.
임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
startDate
와 endDate
를 Period로 묶는다고해서 테이블 구성이 바뀌는 것은 아니다. 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래
스의 수가 더 많은 경우가 있다.
임베디드 타입은 또 다른 임베디드 타입을 가질 수 있다.
임베디드 타입은 엔티티를 필드에 가질 수 있다.
자료 출처 : 김영한님의 자바 ORM 표준 JPA 기본편