오봉이와 함께하는 개발 블로그

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

BE/JPA

JPA - 실전 예제 6 - 값 타입 매핑

오봉봉이 2022. 6. 29. 21:48
728x90

실전 예제 값 타입 매핑

이전 코드
https://5bong2-develop.tistory.com/237

 

JPA - 실전 예제 5 - 연관관계 관리

이전 코드 참조 https://5bong2-develop.tistory.com/233 글로벌 페치 전략 설정 모든 연관관계를 지연 로딩으로 @ManyToOne, @OneToOne은 기본이 즉시 로딩이므로 지연 로딩으로 변경 코드 @Entity @Getter @Sett..

5bong2-develop.tistory.com

코드

@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