주문 조회 V1 : 엔티티 직접 노출
@GetMapping("/api/v1/simple-orders")
public List<Order> ordersV1() { // 무한 순환참조가 일어난다.
List<Order>all= orderRepository.findAllByString(new OrderSearch());
returnall;
}
⇒ 양방향중 한곳에 @JsonIgnore를 달아준다.
- fetch = LAZY ⇒ 지연로딩, Member객체를 new 해서 안가져오고 Order만 가져온다. → 하이버네이트에서 프록시 Member객체를 생성해서 넣어놓는다. (bytebuddy라이브러리가 해줌) → jackson은 프록시 객체 읽지 못함(?) 그래서 500 에러가 생김 → 지연로딩인 경우에는 뿌리지 마 라고 할 수 있다. 하이버네이트 모듈을 설치해줘야함
주문 조회 V2: 엔티티를 DTO 로 반환
- 쿼리가 총 1 + N + N 번 된다. (v1 과 쿼리 수 결과는 같다.)
- order의 결과가 2개면 최악의 경우 1 + 2 + 2 번 실행된다.(최악의 경우)
- 지연로딩은 영속성 컨텍스트에서 조회하므로 이미 조회된 경우 쿼리를 생략한다.
@GetMapping("/api/v2/simple-orders")
public List<SimpleOrderDto> ordersV2() {
List<Order>orders= orderRepository.findAllByString(new OrderSearch());
List<SimpleOrderDto>result=orders.stream()
.map(SimpleOrderDto::new).toList();
return result;
}
@Data
static class SimpleOrderDto {
private Long orderId;
private String name;
private LocalDateTime orderDate;
private OrderStatus orderStatus;
private Address address;
public SimpleOrderDto(Orderorder) {
orderId =order.getId();
name =order.getMember().getName(); // LAZY 초기화
orderDate =order.getOrderDate();
orderStatus =order.getStatus();
address = order.getDelivery().getAddress(); // LAZY 초기화
}
}
'내일배움캠프 > TIL' 카테고리의 다른 글
2023/1/29 (0) | 2023.01.29 |
---|---|
2023/1/17 (0) | 2023.01.17 |
2023/1/16 (0) | 2023.01.16 |
2023/1/13 (0) | 2023.01.13 |
2022/1/12 (0) | 2023.01.12 |