Spring/JPA

지연 로딩과 조회 성능 최적화 - 엔티티를 DTO로 변환(페치 조인 최적화) ERROR

느리지만 꾸준하게 2022. 4. 12. 15:34

error log

2022-04-12 15:27:58.833 ERROR 58221 
--- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : 
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.ast.QuerySyntaxException: expecting "all", found 'o' near line 1, column 56 [select o from jpabook.jpashop.domain.Order ojoin fetch o.member mjoin fetch o.delivery d]; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: expecting "all", found 'o' near line 1, column 56 [select o from jpabook.jpashop.domain.Order ojoin fetch o.member mjoin fetch o.delivery d]] with root cause

org.hibernate.hql.internal.ast.QuerySyntaxException: expecting "all", found 'o' near line 1, column 56 [select o from jpabook.jpashop.domain.Order ojoin fetch o.member mjoin fetch o.delivery d]

 

postman에서 v3를 조회하는 순간 아래같이 에러

http://localhost:8080/api/v3/simple-orders

// OrderSimpleApiController.java

@GetMapping("/api/v3/simple-orders")
    public List<SimpleOrderDto> orderV3() {
        List<Order> orders = orderRepository.findAllWithMemberDelivery();
        List<SimpleOrderDto> result = orders.stream()
                .map(o -> new SimpleOrderDto(o))
                .collect(Collectors.toList());

        return result;
    }
// OrderRepository.java

public List<Order> findAllWithMemberDelivery() {
        return em.createQuery(
                "select o from Order o" +
                        "join fetch o.member m" +
                        "join fetch o.delivery d", Order.class
        ).getResultList();
    }

 

 

 

해결

OrderRepository의 JPQL문을 작성할 때 " join"으로 안해줬기 때문이다.

아래와 같이 해준다.

public List<Order> findAllWithMemberDelivery() {
        return em.createQuery(
            "select o from Order o" +
                    " join fetch o.member m" +
                    " join fetch o.delivery d", Order.class)
                .getResultList();
    }

 

 

 

 

 

 

 

 

 

 

 

<출처 김영한: 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 >

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-API%EA%B0%9C%EB%B0%9C-%EC%84%B1%EB%8A%A5%EC%B5%9C%EC%A0%81%ED%99%94/dashboard

 

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 - 인프런 | 강의

스프링 부트와 JPA를 활용해서 API를 개발합니다. 그리고 JPA 극한의 성능 최적화 방법을 학습할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com