실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
나름의 페이징 처리를 만들어봤습니다
안녕하세요 초보개발자 명아주입니다.
배치를 사용하지 않고, 직접 IN 쿼리를 만들어주게 한번 해봤습니다.
이렇게 하면 실제 쿼리가 2번 나가게 됩니다.
조금더 복잡하긴 하지만, jpa 를 잘 모르는 사람이 보기엔 이해하기 더 좋지 않을까 싶습니다.
단점은 2번째 쿼리가 좀 크게 나가는 점과 distinct 문제, 배치 사이즈의 한계같은 부분이 없다는 것이라고 생각합니다.
public List<Order> findAllWithPaging(int offset, int limit) {
List<Long> ids = em.createQuery("select o.id from Order o", Long.class)
.setFirstResult(offset)
.setMaxResults(limit)
.getResultList();
return em.createQuery("""
select distinct o from Order o
join fetch o.member
join fetch o.delivery
join fetch o.orderItems oi
join fetch oi.item
where o.id in :ids
""", Order.class)
.setParameter("ids", ids)
.getResultList();
}