코드 그라데이션

실전 예제 6. 값 타입 매핑 본문

Spring/JPA 공부

실전 예제 6. 값 타입 매핑

완벽한 장면 2023. 8. 28. 00:14

참고

equals() and hashcode() 구현 시

"Use getters during code generation" 옵션 사용하세요.

 

이 옵션을 선택하면 getter를 호출한다.

이걸 선택하지 않으면 필드에 직접 접근함.

 

필드에 직접 접근하면 문제 발생

무엇이?

Proxy일 때, 계산이 안 된다.

그래서 JPA에서는 메서드를 통해서 값을 호출하도록 코드를 구현하는게 좋다.

그게 안전하다.

 

 

예제 6. 값 타입 매핑 구조도

 

 

 

1. Address 테이블 생성

@Embeddable
public class Address {

  private String city;
  private String street;
  private String zipcode;

  public String getCity() {
    return city;
  }

  public String getStreet() {
    return street;
  }

  public String getZipcode() {
    return zipcode;
  }

  // setter는 일부러 다 막았다.
  private void setCity(String city) {
    this.city = city;
  }

  private void setStreet(String street) {
    this.street = street;
  }

  private void setZipcode(String zipcode) {
    this.zipcode = zipcode;
  }

  // equals and hashcode 구현

  @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());
  }
}

 

2. Member 테이블 수정

@Entity
public class Member extends BaseEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "MEMBER_ID")
  private Long id;

  private String name;

//  private String city;
//  private String street;
//  private String zipcode;
  @Embedded
  private Address address;

  @OneToMany(mappedBy = "member")
  private List<Order> orders = new ArrayList<>();

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Address getAddress() {
    return address;
  }

  public void setAddress(Address address) {
    this.address = address;
  }

  public List<Order> getOrders() {
    return orders;
  }

  public void setOrders(List<Order> orders) {
    this.orders = orders;
  }
}

 

3. Delivery 테이블 수정

@Entity
@NoArgsConstructor
public class Delivery extends BaseEntity {

  @Id
  @GeneratedValue
  private Long id;

//  private String city;
//  private String street;
//  private String zipcode;
  @Embedded
  private Address address;

  private DeliveryStatus status;

  @OneToOne(mappedBy = "delivery", fetch = LAZY)
  private Order order;

}

 

 

실행해보면

똑같이 값 잘 들어가서 생성된다.

 

수업 막판에 값 타입의 장점으로 해서 좀 더 추가한 부분

- 의미있는 메서드 구현해서 활용, validation check 등.

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();
}

 

다시 실행한 거 보면

제약조건이 잘 적용되어 있음.

728x90

'Spring > JPA 공부' 카테고리의 다른 글

ORM에 대한 궁금증과 오해  (3) 2024.03.16
JPQL - 기본 문법과 기능  (0) 2023.08.29
값 타입 컬렉션  (0) 2023.08.27
값 타입의 비교  (0) 2023.08.27
값 타입과 불변 객체  (0) 2023.08.26
Comments