본문 바로가기

Spring/JPA7

[SpringBoot] JPA Collection 페치 조인 최적화 Collection은 @ManyToOne가 아닌 @OneToMany를 사용하는 변수에 사용된다. 하지만, @OneToMany. 즉, 일대다 관계에서 Collection을 조회하면 데이터가 뻥튀기가 된다. 예를 들어, Order(주문), OrderItem(주문된 아이템)이 있다고 했을 때 관계의 주인은 OrderItem이다. 하지만, 관계의 주인(외래키)은 N인 OrderItem이 갖고 있으므로, Order를 기준으로 조인을 진행하면 데이터가 늘어난다. 그렇기에 반환시 중복된 데이터가 나오게 된다. 따라서, 기존의 페치 조인 최적화 쿼리와는 달리 jpql 혹은 querydsl에서 distinct를 추가 해주어야 한다. @Override public List findAllWithItem() { QOrder .. 2024. 1. 29.
[SpringBoot] Repository에서 DTO로 바로 조회 앞 글에서 살펴보았던 페치 조인보다 조금 더 성능적으로 좋은 방법은, Repository에서 DTO로 바로 조회하는 방법이다. 코드 @Query("select new jpabook.jpashop.repository.OrderSimpleQueryDto(o.id, m.name, o.orderDate, o.status, d.address)" + "from Order o" + " join o.member m" + " join o.delivery d") public List findOrderDtos(); 페치 조인 사용시 나가는 쿼리 select o1_0.order_id, d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status, m1_0.membe.. 2024. 1. 28.
[SpringBoot] JPA 페치 조인 최적화 1. 특정 조회 작업 시 엔티티를 그냥 반환하는 경우 @GetMapping("/api/v2/simple-orders") public List ordersV2(){ //ORDER 2개 //N + 1 -> 1 + 회원 N + 배송 N List orders = orderRepository.findAll(new OrderSearch()); List collect = orders.stream() .map(o -> new SimpleOrderDto(o)) .collect(Collectors.toList()); return collect; } 문제점 1 만약 엔티티 설정에 지연 로딩으로 설정하여 놓았다면, 해당 엔티티와 연관된 엔티티들에는 프록시가 들어간다. 하지만, 기본적으로 이 프록시 객체를 Json으로 생성하는.. 2024. 1. 26.