@MappedSuperclass
는 공통된 필드를 모아주는 역할을 한다. 이와 유사하게 임베디드 타입은 공통된 필드를 제공하면서 재사용성을 가능하게 해준다. 그러면 이 둘과의 차이점이 뭘까? 가장 큰 차이점은 바로 상속과 위임의 차이다. @MappedSuperclass
는 추상화 메서드로 주로 사용하며, 필요한 필드들을 상속해준다. 반면에 임베디드 타입을 사용하는 값타입 클래스는 필드와 관련된 메서드들을 만들고, 값타입 클래스를 활용하는 객체로부터 기능을 위임받는다.
@Embeddable
@Embedded
2가지 어노테이션을 사용하면된다.@Embeddable
: 값 타입을 정의하는 곳에 표시@Embedded
: 값 타입을 사용하는 곳에 표시참고로 기본 생성자는 필수이다
@Entity
public class Member{
@Id @GeneratedValue
@Column(name = "member_id")
private Long id;
private String name;
@Embedded
private Address address;
@Embedded
private Period period;
}
Address
, Period
의 값타입을 가져다가 쓰는 Member
엔티티이다.@Embedded
를 사용했다.@Embeddable
public class Period {
private LocalDateTime startDate;
private LocalDateTime endDate;
public Period() {
}
}
@Embeddable //값 타입을 정의하는 곳
public class Address {
private String city;
private String street;
private String zipcode;
public Address() {
}
}
@Embeddable
어노테이션을 사용했다.