임베디드 타입이란?
기본 값 타입을 모아서 만든 새로운 복합 값 타입으로 JPA에서 임베디드 타입이라고 한다.
장점
1) 재사용도 높음
2) 높은 응집도
3) 해당 값 타입만 사용하는 의미있는 메소드를 만들 수 있음(2번 장점과 연관)
4) 임베디드 타입을 포함한 모든 값 타입은,값 타입을 소유한 엔티티에 생명주기를 의존함
임베디드 타입과 테이블 매핑
- 임베디드 타입은 엔티티의 값이다.
- 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블을 같다.
- 객체와 테이블을 아주 세밀하게 매핑하는 것이 가능하다.
- 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많다.
@Entity @Getter @Setter
public class Member {
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
@Column(name="USERNAME")
private String username;
private LocalDateTime startDate;
private LocalDateTime endDate;
private String city;
private String street;
private String zipcode;
}
위와 같은 엔티티에서 임베디드 타입의 복합 값을 만들어 보겠다.
@Entity @Getter @Setter
public class Member {
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
@Column(name="USERNAME")
private String username;
//기간 Period
@Embedded
private Period workPeriod;
//주소
@Embedded
private Address workAddress;
}
@Embeddable
public class Period {
private LocalDateTime startDate;
private LocalDateTime endDate;
}
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
}
임베디드 타입을 사용할 때, 어노테이션이 붙는 위치는
@Embeddable : 값 타입을 정의하는 곳에 표시
@Embedded : 값 타입을 사용하는 곳에 표시
임베디드 타입에는 기본 생성자가 필수적으로 있어야 한다.(매개변수가 필요한 생성자 안 만들었으면 기본적으로 생성됨)
@AttributeOverride :속성 재정의
한 엔티티에서 값을 값 타입을 사용하면 컬럼 명이 중복되면서 오류가 발생한다.
이 때 사용하는 어노테이션으로 사용법은 아래와 같다.
@Entity @Getter @Setter
public class Member {
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
@Column(name="USERNAME")
private String username;
//기간 Period
@Embedded
private Period workPeriod;
//주소
@Embedded
private Address homeAddress;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="city",
column=@Column("WORK_CITY")),
@AttributeOverride(name="street",
column=@Column("WORK_STREET")),
@AttributeOverride(name="zipcode",
column=@Column("WORK_ZIPCODE"))
})
private Address workAddress;
}
(테이블에 city, street, zipcode라는 속성이 2개씩 겹치면 오류가 발생하기 때문, 따라서 속성명을 바꿔줌)
임베디드 타입의 값이 null이면, 매핑한 컬럼 값은 모두 null이 된다.
'JPA' 카테고리의 다른 글
[JPA] 값 타입 비교 (0) | 2023.07.21 |
---|---|
[JPA] 값 타입과 불변 객체 (0) | 2023.07.21 |
[JPA] 영속성 전이(CASCADE)와 고아 객체 (0) | 2023.07.17 |
[JPA] 프록시와 즉시/지연 로딩 (0) | 2023.07.17 |
[JPA] 연관 관계 매핑 (0) | 2023.07.17 |