인프런 커뮤니티 질문&답변

whdk333님의 프로필 이미지

작성한 질문수

연관관계 메서드에 대해 질문드립니다.

작성

·

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

 

  1. member.getOrders().add(this)

     

    -> addOrderItem과 setDelivery에서는 setOrder(this)로 연관관계를 설정해줬는데, 왜 setMember 메소드에서만 getOrders().add(this)로 연관관계를 설정한 것인가요? Member 엔티티의 orders메소드가 List라 그런 것인가요?

     

     

  2. setMember에서는 같은 List임에도 불구하고 this.member = member라고 했는데, 왜 여기서는 add(orderItem)으로 연관관계를 설정한 것인가요? orderItems가 List라서 그런 것인가요?

 

 

 

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

whdk333님의 질문에 대해 답변드리겠습니다.

  1. setMember 메소드에서 getOrders().add(this)로 연관관계를 설정한 이유는 Order 엔티티와 Member 엔티티 간의 양방향 연관 관계를 맺기 위함입니다. Member 엔티티의 orders 필드가 List<Order> 타입으로 여러 Order 엔티티를 참조할 수 있기 때문에, Order 엔티티를 생성하고 Member 엔티티에 연결할 때 Memberorders 리스트에 해당 Order 엔티티를 추가함으로써 양방향 매핑을 완성합니다. 이 경우 Member 엔티티 내부의 List<Order>Order 인스턴스를 추가해야 하므로 getOrders().add(this)를 사용합니다.

  2. 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들을 관리하기 위한 연관관계 메서드가 필요한 것입니다.

어떤 연관관계 메서드를 사용하느냐는 해당 엔티티 간의 관계와 개념적인 모델링에 따라 달라집니다. 연관관계 설정 시 어떤 엔티티가 컨트롤하는 쪽인지, 어떤 방식으로 데이터가 연결되는지를 기준으로 메서드를 구현하게 됩니다.

whdk333님의 프로필 이미지

작성한 질문수

질문하기