주문을 기반으로 주문과 연관된 배송 정보 회원을 조회하는 API를 만들어보겠습니다. 추가로 주문에 딸린 배송 정보와 누가 주문했는지 회원 정보를 포함하도록 해보죠.
지금 만들 API 의 핵심은 지연 로딩 때문에 발생하는 성능 문제를 단계적으로 해결하는게 핵심입니다.
지금부터 설명하는 내용은 정말 중요합니다. 실무에서 JPA를 사용하려면 100% 이해해야 합니다.
주문을 기반으로 주문과 연관된 배송 정보 회원을 조회하는 API 를 만들기 위해서 Order를 조회하는데 Member 와 Delivery 와 연관관계를 걸리게 할겁니다.
Order 와 Member 의 관계는 ManyToOne 입니다. 그리고 Order 와 Delivery 의 관계는 OneToOne 입니다.
둘 다 ToOne 관계라서 엔티티가 직접 들어있습니다.
@Entity
@Table(name = "orders")
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Order {
@ManyToOne (fetch = LAZY)
@JoinColumn(name = "member_id")
private Member member;
@OneToOne(fetch = LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "delivery_id")
private Delivery delivery;
}
ManyToOne 과 OneToOne 인 경우에 어떻게 성능 최적화를 하는지 API 를 만들면서 설명을 하겠습니다.
@RestController
@RequiredArgsConstructor
public class OrderSimpleApiController {
private OrderRepository orderRepository;
@GetMapping("/api/v1/simple-orders")
public List<Order> ordersV1() {
List<Order> all = orderRepository.findAllByString(new OrderSearch());
return all;
}
}
OrderSearch 를 그냥 넘겼다는 것은 검색 조건이 없다는 뜻이니까 DB 에 저장된 모든 주문을 다 조회할겁니다.
그리고 Order 를 리스트로 받아와서 반환했죠. Order 안에 Member 와 Delivery 둘 다 있으니까요.