작성
·
174
0
public List<Order> findAllWithItem() {
return em.createQuery(
"select distinct o from Order o" +
" join fetch o.member m" +
" join fetch o.delivery d" +
" join fetch o.orderItems oi" +
" join fetch oi.item i", Order.class)
.setFirstResult(1) //첫 번째 것을
.setMaxResults(100) //100개 가져옴
.getResultList();
}
이 부분인데 첫 번재부터 100개 가져오는데 우린 2개 가져오니까 하나만 가져오면 되겠다고 하셨는데
왜 하나만 가져오면 되나요? 뭘 하나만 가져온다는 건가요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
질문하신 부분은 JPA에서 실행하는 쿼리에 페이징 처리를 적용하는 상황입니다. setFirstResult(1)
는 조회를 시작할 위치를 지정하고, setMaxResults(100)
는 조회할 데이터의 최대 개수를 지정합니다. 따라서, 이 코드는 쿼리 결과의 두 번째 엔티티부터 시작해서 최대 100개의 Order
엔티티를 가져옵니다.
하나만 가져오라는 말은, 실제로 필요한 데이터가 몇 개인지에 따라 setMaxResults
에 설정하는 값을 줄여서 필요한 만큼만 데이터를 가져오라는 의미일 수 있습니다. 예를 들어, 만약 실제로 필요한 Order
엔티티가 2개뿐이라면 setMaxResults
를 2로 설정하여 불필요한 데이터 로딩을 줄일 수 있습니다.
JPA에서 페이징 처리를 사용할 때는 성능 최적화를 위해 실제로 필요한 데이터 양을 고려하여 적절한 페이징 값을 설정하는 것이 중요합니다. 또한, join fetch
를 사용하여 연관된 엔티티를 한 번에 로딩하는 경우에도 페이징을 적절히 적용하여 너무 많은 데이터를 한 번에 가져오지 않도록 주의해야 합니다.
Spring Data JPA를 활용한다면 Pageable
과 같은 추상화된 페이징 처리 인터페이스를 사용하여 더욱 간편하게 페이징 처리를 할 수 있습니다.
대한 정보는 아래 문서에서 더 자세히 학습하실 수 있습니다.
추가로, JPA 성능 최적화와 관련하여 Stream
, Slice
, Page
등 다양한 반환 타입 및 결과를 처리하는 방법에 대한 정보가 필요하시다면 이 부분도 확인하실 수 있습니다.