컬렉션 조회

V1. 엔티티 직접 노출 엔티티가 변하면 API 스펙이 변한다. 트랜잭션 안에서 지연 로딩 필요(1 + N Query) 양방향 연관관계 문제 V2. 엔티티를 조회해서 DTO로 변환(fetch join 사용X) 트랜잭션 안에서 지연 로딩 필요(1 + N Query) V3. 엔티티를 조회해서 DTO로 변환(fetch join 사용O) 페이징 시에는 N 부분을 포기해야함(대신에 batch fetch size? 옵션 주면 N -> 1 쿼리로 변경 가능) V4. JPA에서 DTO로 바로 조회, 컬렉션 N 조회 (1 + N Query) 페이징 가능 V5. JPA에서 DTO로 바로 조회, 컬렉션 1 조회 최적화 버전 (1 + 1 Query) 페이징 가능 V6. JPA에서 DTO로 바로 조회, 플랫 데이터 (1 Que..
1. 컬렉션 조회 - 플랫 데이터 최적화 V5는 괜찮게 최적화 되었지만 여전히 쿼리가 2번 나간다. 이를 1번만 나가게 하는 방법을 알아보겠다. 방법은 간단하다. 필요한 모든 데이터를 담은 DTO를 새로 만들고, 해당 데이터를 모두 가져와서 우리가 원래 반환 하려는 DTO로 변환해주면 된다. 1. DTO 생성 컬렉션 필드의 값을 채워 넣는 과정을 없애기 위해서 새로운 DTO가 필요하다. @Data public class OrderFlatDto { private Long orderId; private String name; private LocalDateTime orderDate; private OrderStatus orderStatus; private Address address; // 컬렉션 필드 대신..
컬렉션 조회 - DTO로 직접 조회 1. 코드 DTO 변환 조회 메서드의 코드는 다음과 같다. @GetMapping("/api/v3/orders") public List ordersV3() { List orders = orderRepository.findAllWithItem(); List result = orders.stream() .map(o -> new OrderDto(o)).collect(Collectors.toList()); return result; } 1. DTO 생성 @Data public class OrderQueryDto { private Long orderId; private String name; private LocalDateTime orderDate; private OrderSta..
컬렉션 조회 - 페치조인 최적화 V2에서는 엔티티를 직접 노출하지는 않았지만 지연로딩으로 인해 SQL문이 너무 많이 나가는 문제(1 + N 쿼리)가 발생하였다. 이를 해결하기 위해 fetch join을 사용하여 V3를 만들어 보겠다. 1. 코드 Controller @GetMapping("/api/v3/orders") public List ordersV3(){ List orders = orderRepository.findAllWithItem(); List result = orders.stream() .map(o -> new OrderDto(o)) .collect(toList()); return result; } orderRepository public List findAllWithItem() { retur..
컬렉션 조회 - DTO로 변환 이전 V1의 엔티티 노출 문제를 해결하기 위해 DTO로 변환하여 반환해야 한다. 이전과 같은 방식으로 변환하되 DTO 내부에 엔티티를 두어서는 안된다. 1. 코드 @GetMapping("/api/v2/orders") public List ordersV2(){ List orders = orderRepository.findAllByString(new OrderSearch()); List result = orders.stream() .map(o -> new OrderDto(o)) .collect(toList()); return result; } //OrderDto @Data static class OrderDto { private Long orderId; private Strin..
컬렉션 조회 - 엔티티 직접 노출 지금까지 OrderSimpleApiController를 작성하면서 간단한 OrderApiController를 만들어 보았다. Order에는 List 필드가 있는데 해당 컬렉션 필드는 ToOne관계가 아니라 ToMany 관계이기 때문에 다루지 않았었다. 지금부터는 Order에 컬렉션 필드를 추가하여 조회하는 방법을 알아보고자 한다. 1. 코드 @GetMapping("/api/v1/orders") public List ordersv1() { List all = orderRepository.findAllByString(new OrderSearch()); for (Order order : all) { order.getMember().getName(); order.getDeliv..
코드 미식가
'컬렉션 조회' 태그의 글 목록