본문 바로가기
Dev/JPA

[JPA] 실습 - 값 타입 매핑

by dev_jsk 2021. 9. 2.
728x90
반응형

이전 실습에서 값 타입을 매핑해보자

요구사항

  • MemberAddress값 타입 추가
  • DeliveryAddress값 타입 추가

엔티티 설계

Member, Delivery 내 Address 값 타입 추가

실습

Entity

- Address.java

@Embeddable  // 임베디드 타입 설정
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();
    }

    // getter, setter

    // getter를 사용하여 equals를 구현해야 하는 이유
    // getter를 사용하지 않을 경우 프록시 객체 비교 시 제대로 된 비교가 되지 않는다.
    // getter를 호출해야 프록시 객체가 실제 객체에 접근하여 제대로 된 값을 가져오기 때문
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Address address = (Address) obj;
        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());
    }
}

- Member.java

@Entity
public class Member {

    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    private String name;

    @Embedded  // 임베디드 타입
    private Address address;

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

    // getter, setter
}

- Delivery.java

@Entity
public class Delivery {
    
    @Id @GeneratedValue
    private Long id;

    private DeliveryStatus status;

    @Embedded // 임베디드 타입
    private Address address;

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

    // getter, setter
}

동작 결과

Member와 Delivery 내 Address 정보 추가

728x90
반응형

댓글