JPA/JPA 기본

36. 값타입 실전

sdafdq 2023. 10. 30. 00:38

할만한 게 이제 address.

저거 한곳에 모아서 관리하기 괜찮아 보임.

 

근데 이미 하지 않았나..?

 

 

여튼 다시 해봄

@Embeddable
public class Address {
    private String city;
    private String street;
    private String zipcode;
}

getter, setter는 getter는 public, setter는 private

그러므로 생성자는 기본생성자에, 필드들 다 받는거.

 

또 그다음 equals() 오버라이드.

인텔리제이가 자동 생성 해 주는거.

근데 이거 할 때,

저거 getters 사용하라고 체크해주는 게 좋음.

저거 체크 안하면 this. 해서 이렇게 접근하는데, 그러면 프록시일경우 제대로 접근 못함.

프록시는 원본을 째로 가지고 있는거라서. getId()하면 원본.getId() 이런 식으로 호출하게 하는 거라서.

 

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

그럼 이렇게 get으로 짜줌.

 

 

또 이렇게 값타입으로 하면 좋은게,

@Embeddable
public class Address {
    @Column(length = 10)
    private String city;

    @Column(length = 10)
    private String street;

    @Column(length = 10)
    private String zipcode;

    public Address(){

    }
    public Address(String city, String street, String zipcode) {
        this.city = city;
        this.street = street;
        this.zipcode = zipcode;
    }

    public String fullAddress(){
        return getCity() + " " + getStreet() + " " + getZipcode();
    }
}

저렇게 fullAddress() 처럼 의미있는 메소드를 만든다던가,

@Column하는 것 처럼 공통적으로 처리한다던가 할 수 있음.

얘 Member랑 Delivery에도 씀.

 

@Entity
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
public class Delivery {
    @Id @GeneratedValue
    private Long id;

    @Embedded
    private Address address;

    @Enumerated(EnumType.STRING)
    private DeliveryStatus status;


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

 

여튼 그렇고, 다시 UML? 보면

저렇게 Value Type, 즉 값타입 해서 명시해 주면 좋음.

 

'JPA > JPA 기본' 카테고리의 다른 글

38. JPQL 기본 문법  (0) 2023.10.30
37. JPQL  (0) 2023.10.30
35. 값타입 컬렉션  (0) 2023.10.29
34. 값타입 비교  (0) 2023.10.29
33. 값타입과 불변 객체  (0) 2023.10.29