연관관계 메서드에 대해 질문드립니다.
203
작성한 질문수 31
@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들을 관리하기 위한 연관관계 메서드가 필요한 것입니다.
어떤 연관관계 메서드를 사용하느냐는 해당 엔티티 간의 관계와 개념적인 모델링에 따라 달라집니다. 연관관계 설정 시 어떤 엔티티가 컨트롤하는 쪽인지, 어떤 방식으로 데이터가 연결되는지를 기준으로 메서드를 구현하게 됩니다.
changeTeam 메서드 질문
0
2
1
"컴파일 시점에 없는 값을 어떻게 참조할 것인가?" 섹션
1
18
2
테스트 관련 질문!
0
22
2
handleBindException 의 기대의도가 방향이 맞는지 궁금합니다.
0
24
2
SpringBoot 4.0.6 버전에서 PackageLogTracePostProcessor exception
0
30
2
인텔리제이 오류
0
34
1
프로젝트 의존 관계
0
33
2
application.properties가 적용되지 않아요
1
43
3
새 프로젝트 속 제너레이터에 SpringBoot가 없습니다.
0
31
2
섹션3. 11 회원객체 다이어그램
0
30
1
OCP, DIP과 @Qualifier 어노테이션에 대해서 질문합니다.
0
26
1
강의 연장 요청
0
33
2
설정 정보 없이 임베디드 데이터베이스 생성
0
27
1
형 이번에 낸 책이랑 강의 내용에 차이가 있어?
1
56
1
형 나 몰래 책내면 모를 줄 알고?
2
49
2
OrderServiceTest 상문주문 테스트 시 update 쿼리 문의
0
28
1
N+1 관련해서 질문있습니다.
0
53
3
강의 중복 확인 요청
0
33
1
중복내용 제보?!
1
54
2
여러 파드 환경에서 단일 실행 보장 방식
0
34
2
패키지 구분에 대해 궁금한게 있습니다
0
36
2
코드 자료
0
64
2
조회속도 개선에서 더 개선하는 방법이 궁금합니다.
0
50
2
servlet과 container에 대한 질문입니다
0
38
1





