<aside> ❗
최상위 2개로 분류
[엔티티 타입]
식별자로 지속해서 추적 가능
키나 나이 값을 변경해도 식별자로 인식 가능
[값 타입]
단순히 값으로 사용하는 자바 기본 타입이나 객체
값만 있으므로
추적 불가
<aside> ❗
기본값 타입 - 사이드 이펙트 없이 개발 가능
<aside> ❗
생명주기를 엔티티에 의존
값 타입은 공유하면 안 됨
<aside> ❗
기본 타입은 항상 값을 복사함
래퍼 클래스나 String 같은
특수한 클래스는 공유 가능한 객체지이만 변경 X
</aside>
<aside> ❗
새로운 값 타입을 직접 정의할 수 있음
기본 값 타입을 모아서 만들어서 복합 값 타입
이라고도 함값 타입
- 엔티티가 아님
즉, 추적도 안 되고 변경하면 끝임
</aside><aside> ❗
<aside> ❗
근무 기간
- 시작일, 종료일집 주소
- 주소 도시, 주소 번지, 주소 우편번호</aside>
<aside> ❗
기본 생성자 필수
</aside><aside> ❗
값 타입만 사용하는 의미 있는 메서드를 만들 수 있음
임베디드 타입을 포함
한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명주기를 의존
함
</aside><aside> ❗
임베디드 타입은 엔티티의 값일 뿐
이다.임베디드 타입을 사용하기 전과 후
에 매핑하는 테이블은 같다.
아주 세밀하게(find-grained) 매핑하는 것이 가능
→ 클래스로 뽑아서 정의하면 활용할 수 있는게 많음
→ 설계적으로 봤을 때도 깔끔하다.매핑한 테이블의 수보다 클래스의 수가 더 많음
→ 공통 관리, 도메인 용어 공통화 등등 이점이 많음@Entity
public class Member extends BaseEntity{
@Id
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
@Embedded
private Period workPeriod;
@Embedded
private Address homeAddress;
}
@Embeddable
public class Period {
LocalDateTime startDate;
LocalDateTime endDate;
public Period() {
}
...
}
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
public Address() {
}
public Address(String city, String street, String zipcode) {
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
...
}
</aside>