여러 개의 값을 묶어 새로운 값 타입을 직접 정의하여 사용 할 수 있는데, 이를 JPA에서는 임베디드(embedded type)
이라 정의한다.
직접 정의한 임베디드 타입도 int
, String
처럼 값 타입이다.
📖 임베디드 타입을 지정하지 않은 경우
회원 엔티티는 이름, 주소를 가진다.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
// 집 주소 표현
private String city;
private String street;
private String zipcode;
// getter.. setter..
}
임베디드 타입을 지정하지 않은 경우에는 코드가 위와 같은데, 이는 객체지향적이지 않으며 응집력이 상대적으로 약한 코드이다.
📖 임베디드 타입을 지정한 경우
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
// 집 주소 표현
@Embadded
private Address address;
}
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
// ...
}
코드가 더욱 명확해지고 객체지향성을 높이며, 응집력이 상대적으로 높다.
값 타입을 정의하는 곳에 @Embeddable
을 표시
값 타입을 사용하는 곳에 @Embedded
표시
🚨 임베디드 타입은 기본 생성자가 필수로 정의되어 있어야 한다.
또한, 엔티티와 다르게 식별자도 없으며, 생명주기는 자신을 소유하는 엔티티에 의존한다.
hibernate에서는 embedded를 composition이라 부른다.
회원-컴포지션 관계 UML - 김영한님 강의 중
생성자로만 값을 설정하고 Setter 허용하지 말것
equals()로 비교
@Embedded
private Address homeAddress;
@Embedded
private Address workAddress;
@AttributeOverrides
, @AttributeOverride
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
@Embedded
Address homeAddress;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="city", column=@Column(name="COMPANY_CITY")),
@AttributeOverride(name="street", column=@Column(name="COMPANY_STREET")),
@AttributeOverride(name="zipcode", column=@Column(name="COMPANY_ZIPCODE"))
})
Address companyAddress;
}
tstory - developer_hm님 블로그
velog - conatuseus님 블로그
개인적으로 공부하며 기록한 내용으로, 틀린 내용이 있는 경우 덧글을 달아주시면 감사하겠습니다. 😍