본문 바로가기

JPA

2월 23일 JPA 간단한 주문조회 v2

@GetMapping("/api/v2/simple-orders")

public List<SimpleOrderDTO> orderV2(){

 List<order> orders = orderRepository.findAllByString(new OrderSearch());

 //일단 엔티티값을 조회해 온다.

 

 List<simpleOrderDTO> result = orders.stream()

 .map(o -> new SimpleOrderDTO(o))

 .collect(Collectors.toList());

 //엔티티를 DTO로 바꾸고 List로 다시 변환

 

 return result;

}

 

@Data

static class SimpleOrderDTO{

private Long orderId;

private String name;

private LocalDateTime orderDate;

private OrderStatus orderStatus;

private Address address;

 

public SimpleOrderDTO(Order order){ //생성자를 사용하서 람다식을 통해 DTO 세팅

 orderId = order.getId();

 name = order.getMamber().getName();

 orderDate = order.getOrderDate();

 orderStatus = order.getStatus();

 address = order.getDelivery().getAddress();

}

 

-API에서 받아온 엔티티는 그대로 반환해서는 안된다,

-DTO로 변환해서 반환해야 한다.

-V1, V2 둘다 지연로딩으로 인한 SQL이 너무 느리다는 문제점이 있다.

n+1 문제

-최초 Order 조회에 1번 DTO반환시 프록시 객체들 때문에 2번씩 더 작동한다.

-지연로딩 객체 member와 delivery에 접근시 발생

-최초 의도한 1번 이외에 지연로딩 때문에 추가적으로 SQL이 동작하는걸 n+1문제라고 한다.

-최초 쿼리문 하나에 +n번 만큼 쿼리가 더 작동하는 문제를 말한다.

'JPA' 카테고리의 다른 글

2월 24일 JPA 간단한 주문조회 V4  (0) 2023.02.24
2월 23일 JPA 간단한 주문조회 V3  (0) 2023.02.23
2월 22일 JPA API 개발 고급  (0) 2023.02.22
2월 22일 JPA 회원조회 V2  (0) 2023.02.22
2월 22일 JPA 회원조회 API  (0) 2023.02.22