임베디드 타입
- 새로운 값 타입을 직접 정의할 수 있음
- JPA는 임베디드(embedded type) 타입이라 함
- 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함
- int, String과 같은 특성의 값 타입
- 엔티티가 아니어서 변경하면 추적이 안된다
위와 같은 회원 엔티티가 있다고 보자
회원 엔티티의 필드를 보면 (startDate, endDate) = workPeriod, (city, street, zipcode) = homeAddress필드를 묶을 수 있다.
이렇게 묶을 수 있는 것이 임베디드 타입이다.
Period, Address를 클래스를 만들어서 저장하면 된다.
임베디드 타입 사용법
- @Embeddable : 값 타입을 정의하는 곳에 표시
- @Embedded : 값 타입을 사용하는 곳에 표시
- 기본 생성자 필수
임베디드 타입의 장점
- 재사용이 가능하다.
- 높은 응집도를 가진다.
- Period.isWork()같은 (현재 기간이 근무기간에 속하는지 확인하는 메서드) 해당 값 타입만 사용하는 의미 있는 메서드를 만들 수 있다.
- 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티의 생명주기를 의존한다.
- 엔티티가 생성되면 생성되고 엔티티가 삭제되면 같이 삭제된다.
임베디드 타입과 테이블 매핑
테이블 입장에서는 바뀌는게 없다. 매핑만 해주면 된다.
코드를 작성해 보자
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String name;
@Embedded
private Period workPeriod;
@Embedded
private Address homeAddress;
@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() {
}
테이블이 잘 생성된 것을 확인할 수 있다.
- 임베디드 타입은 엔티이의 값일 뿐이다.
- 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블이 같다.
- 객체와 테이블을 아주 세밀하게 매핑하는 것이 가능하다.
- 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 매핑한 클래스의 수가 더 많다.
- 임베디드 타입은 필드에 Entity를 가질 수 있다. ex) Address 클래스의 필드에 Member member가능
- 임베디드 타입이 null이면 매핑된 칼럼이 모두 null이다.
@AttributeOverride 속성
한 엔티티에서 같은 값 타입을 사용하면??
만약 위 예시에서 Member에 Address를 2개 사용하려면 어떻게 해야 할까?? 그냥 사용하면 칼럼이 중복되므로 에러가 발생한다. 이때 @AttributeOverride를 사용해 준다.
@Embedded
private Address homeAddress;
@Embedded
@AttributeOverrides( {
@AttributeOverride(name = "city",
column = @Column(name = "WORK_CITY")),
@AttributeOverride(name = "street",
column = @Column(name = "WORK_STREET")),
@AttributeOverride(name = "zipcode",
column = @Column(name = "WROK_ZIPCODE"))
})
private Address workAddress;
테이블이 잘 생성된 것을 볼 수 있다.
'JPA' 카테고리의 다른 글
JPQL(Java Persistence Query Language) (0) | 2024.01.03 |
---|---|
값 타입, 값 타입 컬렉션 (0) | 2023.09.01 |
기본값 타입 (0) | 2023.08.31 |
영속성 전이 : CASCADE, 고아객체 (0) | 2023.08.31 |
즉시 로딩과 지연 로딩 (0) | 2023.08.30 |