tevelop RSS 태그 관리 글쓰기 방명록
2023-01-26 21:43:10

주문 조회 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
tevelop. Designed by 코딩재개발.