본문 바로가기
Framework and Tool/JPA

JPA - 값 타입 - 요구사항 분석과 맵핑5

by ocwokocw 2021. 7. 27.

- 참조: 자바 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 를 조회하여 잘 적용되었는지 확인해보자.

값 타입의 사용법은 간단하지만 잘 이용하면 추상화 단계가 높아져서 엔티티의 구조를 한눈에 파악하기가 쉬워진다. 무언가 중복되는 정보가 있거나 엔티티가 너무 낮은 수준의 정보를 표현하고 있다면 값 타입을 한번 이용해보자.

댓글