임베디드(embedded) 란 영어로 간직하다, 끼워넣다 라는 뜻. 즉, 내부에 무언가를 포함하고 있는 상태
임베디드 타입은 사용자가 직접 정의한 값 타입.
예를들어, User Entity에 Address 객체는 zipcode, street, lot 등으로 이루어져있는데, 모두 사용자의 주소를 나타내는 객체들이다.
이 값들을 임베디드 타입으로 정의하지 않으면 “User는 아이디, 비밀번호, 우편번호, 도로명주소, 지번주소를 가진다.” 라고 풀어서 설명되지만,
임베디드 타입으로 정의하면 “User는 아이디, 비밀번호, 집주소(우편번호, 도로명주소, 지번주소)를 가진다” 라고 설명된다.
아래와 같이 부모필드 상단에 @Embedded, 자식 필드 클래스 상단에 @Embeddable (생략가능) 을 붙여준다.
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long uid;
private String name;
private String phoneNum;
@Embedded // 생략 불가
private Address address;
}
@Embeddable // 생략 가능
public class Address {
private String zipCode;
private String address1;
private String address2;
}
예를들어, 주소객체를 엔티티로 생성했다면 임베디드 타입을 지정해줄 필요는 없다.
엔티티와 임베디드는 다른 개념임.
주소 객체의 재사용성을 더 높이려면 임베디드보다 엔티티로 생성하는게 더 나을지도?