본 글은 인프런의 김영한님 강의 자바 ORM 표준 JPA 프로그래밍 - 기본편
을 수강하며 기록한 필기 내용을 정리한 글입니다.
-> 인프런
-> 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의
<예시>
위 사진과 같이 JPA 내에서는 임베디드 값 타입으로 Period와 Address를 만들어서 활용하게 되지만, 실제로 DB에 저장되는 필드들은 임베디드 값 타입 이전과 동일한 것을 확인할 수 있다.
임베디드 값 타입 매핑만 잘 해두면 DB 구조를 유지하면서 JPA 내에서만 임베디드 값 타입을 만들어 유용하게 활용할 수 있는 것!
묶기 전 Member 엔티티
@Entity
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;
...
public class Period{
private LocalDateTime startDate;
private LocalDateTime endDate;
}
public class Address{
private String city;
private String street;
private String zipcode;
}
public class Member{
@Id
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name="USERNAME")
private String username;
private Period workPeriod;
private Address homeAddress;
...
이렇게만 해두면 에러난다. JPA에게 임베디드 값 타입이라는 것을 알려주어야 함.
임베디드 값 타입을 적용하기 위해 Period와 Address 처럼 임베디드 값 타입을 만드는 곳은 “@Embeddable”,
Member의 workPeriod와 homeAddress 처럼 임베디드 값 타입을 쓰는 곳은 “@Embedded”
어노테이션을 활용한다.
@Embeddable
public class Period{
@Column(name = "START_DATE_TIME")
private LocalDateTime startDate;
@Column(name = "END_DATE_TIME")
private LocalDateTime endDate;
}
→또, 위와 같이 각 필드에 @Column 어노테이션을 넣을 수도 있다.
@Embeddable
public class Address{
...
...
@Embedded
private Period workPeriod;
@Embedded
private Address homeAddress;
...
원래는 @Embeddable, @Embedded 둘 중 하나만 써도 되지만, 웬만하면 두 곳 모두 적어주는게 좋다.
다음과 같이 Period class 내에 “isWork()” 와 같이 전용 메소드를 추가해 줄 수도 있다.
@Embeddable
public class Period{
...
public boolean isWork(){
}
...
public Address(){
}
public Address(String city, String street, String zipcode) {
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
Member member = new Member();
member.setUsername("member1");
member.setHomeAddress(new Address("city", "street", "zipcode");
member.setWorkPeriod(new Period(~~));
...
위 예시에서는 Member 내에 집주소(homeAddress)만 있었지만, 만약 직장주소(workAddress)도 필요하다면?
@Embedded
private Address homeAddress;
@Embedded
private Address workAddress;
⇒ @AttributeOverrides, @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 = "WORK_ZIPCODE"))
})
private Address workAddress;