오봉이와 함께하는 개발 블로그
JPA - 실전 예제 6 - 값 타입 매핑 본문
728x90
실전 예제 값 타입 매핑
이전 코드
https://5bong2-develop.tistory.com/237
코드
@Entity
@Getter @Setter
public class Member extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "MEMBER_ID")
private Long id;
private String name;
@Embedded
private Address address;
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
}
@Entity
@Getter @Setter
public class Delivery extends BaseEntity{
@Id @GeneratedValue
@Column(name = "DELIVERY_ID")
private Long id;
@Embedded
private Address address;
private DeliveryStatus status;
@OneToOne(mappedBy = "delivery", fetch = FetchType.LAZY)
private Order order;
}
@Embeddable
@Getter @Setter(AccessLevel.PRIVATE) // setter는 private으로
public class Address {
@Column(length = 10)
private String city;
@Column(length = 20)
private String street;
@Column(length = 5)
private String zipcode;
public String fullAddress() {
return getCity() + " " + getStreet() + " " + getZipcode();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Address address = (Address) o;
return Objects.equals(getCity(), address.getCity()) &&
Objects.equals(getStreet(), address.getStreet()) &&
Objects.equals(getZipcode(), address.getZipcode());
}
@Override
public int hashCode() {
return Objects.hash(getCity(), getStreet(), getZipcode());
}
}
정리
@Column(length = 10)을 통해 글자수에 제한을 두거나, fullAddress() 같은 메소드를 만들어 의미있게 사용하면 값 타입의 장점이 극대화될 수 있다.
equals 메소드를 오버라이드 할 때는 직접 접근하지 않고 getter를 통해 필드에 접근한다.
getter를 통해 접근하면 프록시 객체가 진짜 객체에 접근해서 값을 얻어올 수 있지만, 필드에 직접 접근하면 프록시일 때는 값을 얻어오지 못 하기 때문에 계산이 되지 않는다.
JPA에서는 항상 프록시에 대비해서 코드를 작성해야 한다.
출처 : 인프런 김영한 지식공유자님의 스프링 부트와 JPA 실무 완전 정복 로드맵 강의
728x90
'BE > JPA' 카테고리의 다른 글
JPA - 기본 문법과 쿼리 API (0) | 2022.06.30 |
---|---|
JPA - 객체 지향 쿼리 언어 소개 (0) | 2022.06.29 |
JPA - 값 타입 컬렉션 (0) | 2022.06.29 |
JPA - 값 타입의 비교 (0) | 2022.06.29 |
JPA - 값 타입과 불변 객체 (0) | 2022.06.29 |
Comments