작성
·
123
0
@Entity
@Table(name = "orders")
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
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); // Member 엔티티 부분 : private List<Order> orders = new ArrayList<>();
}
public void addOrderItem(OrderItem orderItem) {
orderItems.add(orderItem); // OrderItem 엔티티 부분 : private Order order;
orderItem.setOrder(this);
}
public void setDelivery(Delivery delivery) {
this.delivery = delivery; // Delibery 엔티티 부분 : private Order order;
delivery.setOrder(this);
}
member.getOrders().add(this)
-> addOrderItem과 setDelivery에서는 setOrder(this)로 연관관계를 설정해줬는데, 왜 setMember 메소드에서만 getOrders().add(this)로 연관관계를 설정한 것인가요? Member 엔티티의 orders메소드가 List라 그런 것인가요?
setMember에서는 같은 List임에도 불구하고 this.member = member라고 했는데, 왜 여기서는 add(orderItem)으로 연관관계를 설정한 것인가요? orderItems가 List라서 그런 것인가요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
whdk333님의 질문에 대해 답변드리겠습니다.
setMember
메소드에서 getOrders().add(this)
로 연관관계를 설정한 이유는 Order
엔티티와 Member
엔티티 간의 양방향 연관 관계를 맺기 위함입니다. Member
엔티티의 orders
필드가 List<Order>
타입으로 여러 Order
엔티티를 참조할 수 있기 때문에, Order
엔티티를 생성하고 Member
엔티티에 연결할 때 Member
의 orders
리스트에 해당 Order
엔티티를 추가함으로써 양방향 매핑을 완성합니다. 이 경우 Member
엔티티 내부의 List<Order>
에 Order
인스턴스를 추가해야 하므로 getOrders().add(this)
를 사용합니다.
setMember
메소드와 addOrderItem
메소드의 차이는 연관관계의 주체가 무엇이냐에 따라 달라집니다. setMember
에서 this.member = member
와 같이 설정하는 것은 Order
엔티티 입장에서 Member
엔티티를 설정하는 것입니다. 한편, addOrderItem
에서 orderItems.add(orderItem)
을 호출하는 이유는 Order
엔티티가 여러 개의 OrderItem
엔티티를 갖는 컬렉션을 관리하기 때문입니다. 여기서 OrderItem
엔티티 각각에 대해 역방향으로 Order
엔티티를 설정하기 위해 orderItem.setOrder(this)
를 호출합니다. 즉, Order
엔티티와 OrderItem
엔티티는 1:N 관계에 있으며, Order
엔티티에 속한 OrderItem
들을 관리하기 위한 연관관계 메서드가 필요한 것입니다.
어떤 연관관계 메서드를 사용하느냐는 해당 엔티티 간의 관계와 개념적인 모델링에 따라 달라집니다. 연관관계 설정 시 어떤 엔티티가 컨트롤하는 쪽인지, 어떤 방식으로 데이터가 연결되는지를 기준으로 메서드를 구현하게 됩니다.