주문을 기반으로 주문과 연관된 배송 정보 회원을 조회하는 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 를 만들면서 설명을 하겠습니다.

간단한 주문 조회 V1: 엔티티를 직접 노출

@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 둘 다 있으니까요.