- 참조: 자바 ORM 표준 JPA 프로그래밍
- 값 타입 사용
이전에 사용했던 UML 다이어그램을 잠시 살펴보자.
위의 다이어그램에서 Member 와 Delivery 엔티티에 city, street, zipcode 속성을 주소로 맵핑해보자.
우선 Address 값 타입을 선언해보자.
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((city == null) ? 0 : city.hashCode());
result = prime * result + ((street == null) ? 0 : street.hashCode());
result = prime * result + ((zipcode == null) ? 0 : zipcode.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
........................
앞에서도 언급했듯이 값 타입은 Value object 라서 동등성을 판단할 때 속성들의 값을 이용한다. 따라서 hashCode 와 equals 도 잊지않고 추가해주도록 하자.
Member 와 Delivery 엔티티의 city, street, zipcode 속성들을 값 타입의 Address 로 변환해준다.
@Entity
public class Member extends DateMarkable{
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
@Embedded
private Address address;
.........
@Entity
public class Delivery extends DateMarkable{
@Id @GeneratedValue
@Column(name = "DELIVERY_ID")
private Long id;
@Embedded
private Address address;
@Enumerated(EnumType.STRING)
private DeliveryStatus status;
@OneToOne(mappedBy = "delivery")
private Order order;
H2 를 조회하여 잘 적용되었는지 확인해보자.
값 타입의 사용법은 간단하지만 잘 이용하면 추상화 단계가 높아져서 엔티티의 구조를 한눈에 파악하기가 쉬워진다. 무언가 중복되는 정보가 있거나 엔티티가 너무 낮은 수준의 정보를 표현하고 있다면 값 타입을 한번 이용해보자.
'Framework and Tool > JPA' 카테고리의 다른 글
JPA - 객체지향 쿼리 언어 - JPQL 기본 (0) | 2021.07.29 |
---|---|
JPA - 객체지향 쿼리 언어 - 개요 (0) | 2021.07.28 |
JPA - 값 타입 - 값 타입 컬렉션 (0) | 2021.07.25 |
JPA - 값 타입 - 불변객체 (0) | 2021.07.22 |
JPA - 값 타입 - 임베디드 타입 (0) | 2021.07.20 |
댓글