목록분류 전체보기 (572)
오봉이와 함께하는 개발 블로그
주문 조회 V3.1: 엔티티를 DTO로 변환 - 페이징과 한계 돌파 컬렉션을 페치 조인하면 페이징이 불가능하다. 컬렉션을 페치 조인하면 일대다 조인이 발생하므로 데이터가 예측할 수 없이 증가한다. 일대다에서 일(1)을 기준으로 페이징을 하는 것이 목적인데, 데이터는 다(N)를 기준으로 row가 생성된다. Order를 기준으로 페이징을 하고 싶은데, 다(N)인 OrderItem을 조인하면 OrderItem이 기준이 된다. 이 경우 하이버네이트는 경고 로그를 남기고 모든 DB 데이터를 읽어서 메모리에서 페이징을 시도한다. 이는 최악의 경우 장애로 이어질 수 있다. 한계 돌파 그러면 페이징 + 컬렉션 엔티티를 함께 조회하려면 어떻게 해야할까? 지금부터 코드도 단순하고, 성능 최적화도 보장하는 매우 강력한 방법..
주문 조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화 OrderApiController에 추가 @GetMapping("/api/v3/orders") public List orderV3() { List orders = orderRepository.findAllWithItem(); List result = orders.stream() .map(o -> new OrderDto(o)) .collect(toList()); return result; } OrderRepository에 추가 public List findAllWithItem() { return em.createQuery("select distinct o from Order o" + " join fetch o.member m" + " join ..
주문 조회 V2: 엔티티를 DTO로 변환 @GetMapping("/api/v1/orders") public List ordersV2() { List orders = orderRepository.findAllByCriteria(new OrderSearch()); List result = orders.stream() .map(o -> new OrderDto(o)) .collect(toList()); return result; } OrderApiController에 추가 @Data static class OrderDto { private Long orderId; private String name; private LocalDateTime orderDate; private OrderStatus orderStat..
주문 조회 V1: 엔티티 직접 노출 주문내역에서 추가로 주문한 상품 정보를 추가로 조회하자. Order기준으로 컬렉션인 OrderItem와 Item이 필요하다. 앞의 예제에서는 XtoOne(OneToOne, ManyToOne)관계만 있었다. XtoOne관계에서는 fetch join을 사용해서 쉽게 해결할 수 있지만 일대다 관계는 얘기가 다르다. 예를 들어 1:3 관계라고 하면 1을 조회하기 위해 쿼리가 3개 더 추가되는 문제가 있고, 이런 경우 최적화하기 어렵다는 문제가 있다. 이번에는 컬렉션인 일대다 관계(OneToMany)를 조회하고, 최적화하는 방법을 알아보자. /** * V1. 엔티티 직접 노출 * - 엔티티가 변하면 API 스펙이 변한다. * - 트랜잭션 안에서 지연 로딩 필요 * - 양방향 연..
간단한 주문 조회 V4: JPA에서 DTO로 바로 조회 OrderSimpleApiController - 추가 @GetMapping("/api/v4/simple-orders") public List ordersV4() { return orderRepository.findOrderDtos(); } OrderSimpleQueryRepository 조회 전용 리포지토리 public List findOrderDtos() { return em.createQuery("select " + "new jpabook.jpashop.repository.OrderSimpleQueryDto(o.id, m.name, o.orderDate, o.status, d.address) " + "from Order o " + "join o...