[JPA] limit 대신 paging

타미·2020년 10월 12일
0

JPA실험실

목록 보기
7/8
post-custom-banner

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 할 수 있다. (ㄱㅇㄷ)

profile
IT's 호기심 천국
post-custom-banner

0개의 댓글