처음만들 API는 주문 + 배송정보 + 회원을 조회하는 API를 만들어볼 것이다.
이때 지연로딩때문에 발생하는 성능 문제가 있음. 이걸 단계적으로 해결해보는게 첫 과제이다.
이건 JPA사용의 가장 필수적인 지식이니 반드시 숙지해야 한다. 이걸 모르고 JPA를 사용하면 JPA성능 안나온다고 욕하게 된다…
지금 만들 것들은 다 ToOne관계를 맺고 있다. 이런 관계에서 성능최적화 하는 법을 배울 것임
order와 Member는 ManyToOne, Delivery와 order는 OneToOne관계이다.
이번 버전에서는 엔티티를 직접 노출한 버전의 API를 만들면서, ToOne관계를 조인해 반환하는 API에서 어떤 문제가 있는지 알아볼 것이다.
package jpabook.jpashop.api;
import jpabook.jpashop.domain.Order;
import jpabook.jpashop.repository.OrderRepository;
import jpabook.jpashop.repository.OrderSearch;
import jpabook.jpashop.service.OrderService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* xToOne관계
* Order
* Order -> Member (ManyToOne)
* Order -> Delivery (OneToOne)
*/
@RestController
@RequiredArgsConstructor
public class OrderSimpleApiController {
private final OrderService orderService;
private final OrderRepository orderRepository;
@GetMapping("/api/v1/simple-orders")
public List<Order> ordersV1() {
List<Order> all = orderRepository.findAllByString(new OrderSearch());
return all;
}
}
Order안에 Member와 Delivery가 있기 때문에 그냥 가장 무식하게 모든 Order를 조회하는 방법이다.
무한루프에 빠져서 미친듯이 데이터를 가져오고 있다….
이는 Order에서 Member를 가져오는데, Member에 또 Order가 있어서 Order를 가져오고… 다시 Member를 가져오고… 이런식으로 무한정 가져오기 때문이다.