QueryDSL에서 limit을 사용하면 full scan한 후 메모리에 로드한 후 limit한다.
OneToOne이나 ManyToOne에서는 Eager Loading할 때에도 그렇게 큰 문제가 없다고 해도
OneToMany에서는 큰 문제가 있을 수 있고(->warning)
애초에 의도하지 않은대로 메모리에 다 올린다는 문제가 있다.
이럴 때에는 Paging을 사용해야 한다. Paging을 통해 조회하면 query 자체에서 limit를 해준다.
Pageable pageable = PageRequest.of(0, 3, Sort.by(Sort.Direction.ASC, "id"));
Page<Instagram> all = instagramRepository.findAll(pageable);
List<Instagram> content = all.getContent();
assertThat(content).hasSize(3);
assertThat(content.get(0).getId()).isEqualTo(1L);
assertThat(content.get(1).getId()).isEqualTo(2L);
assertThat(content.get(2).getId()).isEqualTo(3L);
Hibernate:
select
instagram0_.instagram_id as instagra1_4_,
instagram0_.created_date as created_2_4_,
instagram0_.modified_date as modified3_4_,
instagram0_.hashtag_count as hashtag_4_4_,
instagram0_.hashtag_name as hashtag_5_4_,
instagram0_.name as name6_4_,
instagram0_.place_id as place_id7_4_
from
instagram instagram0_
order by
instagram0_.instagram_id asc limit ?
JpaRepository는 PagingRepository를 상속 받고 있어서 바로 Paging 할 수 있다. (ㄱㅇㄷ)