값 타입은 아래와 같이 3가지로 나눌 수 있다.
// 기본 값 타입 예제
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
private int age;
...
}
// 임베디드 타입 적용 전 엔티티 예제
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
// 근무 기간
@Temporal(TemporalType.Date) Date startDate;
@Temporal(TemporalType.Date) Date endDate;
// 집 주소 표현
private String city
private String street;
private String zipcode;
// ...
}
위의 엔티티를 누군가에게 설명한다면 이렇게 설명할 것 같다.
이 엔티티를 아래와 같은 설명처럼 바꿀 수는 없을까?
회원 엔티티에 속한 모든 데이터를 그대로 가지고 있는 것은 객체지향적이지 못하다.
따라서 임베디드 타입을 사용해 근무기간, 주소와 같은 타입을 만들어 사용하게 된다.
// 임베디드 값 타입 적용 예제 - 엔티티
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
@Embedded Period workPeriod; // 근무기간
@Embedded Address homeAddress; // 집 주소
}
// 임베디드 타입 정의 예제 - 기간 임베디드 타입
@Embedded
public class Period {
@Temporal(TemporalType.Date) Date startDate;
@Temporal(TemporalType.Date) Date endDate;
//...
public boolean isWork(Date date) {
//... 값 타입을 위한 메서드를 정의할 수 있다.
}
}
// 임베디드 타입 정의 예제 - 주소 임베디드 타입
@Embedded
public class Address {
@Column(name="city") // 매핑할 컬럼 정의 가능
private String city;
private String street;
private String zipcode;
//...
> }
💡 임베디드 타입은 기본 생성자가 필수다.
// 임베디드 타입과 연관관계 예제
@Entity
public class Member {
@Embedded Address address; // 임베디드 타입 포함
@Embedded PhoneNumber phoneNumber; // 임베디드 타입 포함
}
@Embeddable
public class Address {
String street;
String city;
String state;
@Embedded Zipcode zipcode; // 임베디드 타입 포함
}
@Embaddable
public class Zipcode {
String zip;
String plusFor;
}
@Embaddable
public class PhoneNumber {
String areaCode;
String localNumber;
@ManyToOne PhoneServiceProvider provider; // 엔티티 참조
...
}
@Entity
public class PhoneServiceProvider {
@Id String name;
...
}