Java-Chip4 / StudyingRecord

강의 내용 정리📝
6 stars 2 forks source link

연관관계 편의 메서드(객체와 테이블의 패러다임 불일치) #18

Closed KimChanJin97 closed 2 years ago

KimChanJin97 commented 2 years ago

객체와 테이블은 차이가 있다. 객체는 연관관계가 있는 두 군데(1쪽과 N쪽)에 모두 참조할 수 있는 객체가 존재해야만 서로를 참조할 수 있고, 테이블은 한 군데(N쪽)에 외래키 하나만으로 두 객체가 서로 참조(심지어 역참조도)할 수 있다.

그래서, 테이블 관점으로 보면, 한 곳(N쪽 : OrderItem)에만 외래키가 있기 때문에, 객체에서도 한 곳(N쪽 : OrderItem)에서 참조값을 넣어주면, 당연히 들어가겠지라고 생각을 할 수 있다. 하지만, 객체에서는 두 군데(1쪽: Order & N쪽: OrderItem)에 다 참조값을 넣어줘야만 참조가 가능하다. 각각 @ManyToOne 어노테이션과 @OneToMany 어노테이션이 서로 참조하기 위한 것이다.

연관관계 매핑이 끝났다면 참조와 역참조가 가능하도록 메서드를 만들어주는데 이를 연관관계 편의 메소드라고 부른다. 그리고 두 군데(1쪽: Order & N쪽: OrderItem)에서 객체들의 연관관계 매핑이 끝났다면 참조와 역참조가 가능하도록 메서드를 만들어주는데 이를 연관관계 편의 메소드라고 부른다. 이 때, 하나의 클래스를 정해서 이 곳에서만 연관관계 편의 메소드를 만드는데, 연관관계 편의 메소드는 주로 접근하는 도메인을 고려하여 만들어준다.

// 1쪽 : Order
@Entity
@Table(name = "orders")
@Getter @Setter
public class Order {
    @Id 
    @GeneratedValue
    @Column(name = "order_id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private Member member; //주문 회원

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private List<OrderItem> orderItems = new ArrayList<>();

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "delivery_id")
    private Delivery delivery; //배송정보

    private LocalDateTime orderDate; //주문시간

    @Enumerated(EnumType.STRING)
    private OrderStatus status; //주문상태 [ORDER, CANCEL]

    //==연관관계 메서드==//
    public void setMember(Member member) {
        this.member = member;
        member.getOrders().add(this);
 }
    public void addOrderItem(OrderItem orderItem) {
        orderItems.add(orderItem);
        orderItem.setOrder(this);
 }
    public void setDelivery(Delivery delivery) {
        this.delivery = delivery;
        delivery.setOrder(this);
    }
}
// N쪽 : OrderItem
@Entity
@Table(name = "order_item")
@Getter @Setter
public class OrderItem {
    @Id 
    @GeneratedValue
    @Column(name = "order_item_id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "item_id")
    private Item item; //주문 상품

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "order_id")
   private Order order; //주문

   private int orderPrice; //주문 가격

   private int count; //주문 수량
}
KimChanJin97 commented 2 years ago

해결