👩🏻‍💻 Programming/SpringBoot

Pageable과 Page Request

한국의 메타몽 2021. 9. 5. 15:55

 

먼저 Paging이란?

 

DB에 저장된 Entity들을 페이지로 나누는 것이다.

예를 들어 DB에 21개의 게시판 글이 작성되었다고 가정하자.

프론트에서 "DB에 있는 게시판을 5개씩 분류해서, 두 번째 파트를 줘!"라고 요청한다.

그러면 백엔드에서는 5개씩 분류하고, 분로된 게시판들의 두 번째 파트를 프론트에 넘겨준다.

위 상황과 같이, 일정 갯수만큼 분류하고 분류된 부분들 중 어떠한 부분을 보내주는 것이 Paging이다.

 

 

Paging은 왜 필요할까?

 

Paging은 Sort(정렬)의 개념을 갖고있다. 예컨데 DB 수가 적다면 List 형식으로 DB 전체목록을 가져와 쿼리메소드로 정렬을 하건, 원하는 부분만 sortging을 하건 성능의 큰 차이는 없을 것이다. 하지만 실제 서비스가 가지고 있는 기능들이 복잡하고, DB의 수가 기하급수적으로 늘어난다면 이는 성능에 큰 영향을 끼친다. 일일이 sort 메소드를 구현하는 것도 일이 될 것이다. 때문에 SpringBoot내부에서 제공하는 Paging을 통해 효율적으로 data를 반환하는 것이 권장된다.

 

 

사용법

 

Repository의 findAll 메소드의 paremeter에 Pageable을 적용하거나, Pageable의 구현체인 PageRequest를 넣어주면 된다.

 

[JPA Repository에 Pageable 추가]

 

    // 기본
    List<User> findByName(String name);
    // Pageable 적용
    Page<User> findByName(String name, Pageable pageable);

 

[Paramter에 Pageable 적용]

System.out.println("findByNameWithPaging : " + userRepository.findAll(PageRequest.of(0, 1, Sort.by("id").descending())).getContent());

getContent()를 넣지 않을 경우 결과(=내부값)을 보여주지 않으니 참고하자.

 

[Pageable의 구현체인 PageRequest를 적용]

System.out.println("findByNameWithPaging : " + userRepository.findByName("martin",PageRequest.of(0,1,Sort.by(Sort.Order.desc("id")))).getContent());

 

* JUnit 테스트 코드에 작성했다.

 

 

결과

 

[Paramter에 Pageable 적용]

Hibernate: 
    select
        user0_.id as id1_1_,
        user0_.created_at as created_2_1_,
        user0_.email as email3_1_,
        user0_.name as name4_1_,
        user0_.updated_at as updated_5_1_ 
    from
        user user0_ 
    order by
        user0_.id desc limit ?
Hibernate: 
    select
        addresses0_.user_id as user_id1_2_0_,
        addresses0_.addresses_id as addresse2_2_0_,
        address1_.id as id1_0_1_ 
    from
        user_addresses addresses0_ 
    inner join
        address address1_ 
            on addresses0_.addresses_id=address1_.id 
    where
        addresses0_.user_id=?
Hibernate: 
    select
        count(user0_.id) as col_0_0_ 
    from
        user user0_
findByNameWithPaging : [User(id=5, name=martin, email=martin@another.com, createdAt=2021-09-05T15:45:48.835077, updatedAt=2021-09-05T15:45:48.835077, addresses=[])]

 

[Pageable의 구현체인 PageRequest를 적용]

Hibernate: 
    select
        user0_.id as id1_1_,
        user0_.created_at as created_2_1_,
        user0_.email as email3_1_,
        user0_.name as name4_1_,
        user0_.updated_at as updated_5_1_ 
    from
        user user0_ 
    where
        user0_.name=? 
    order by
        user0_.id desc limit ?
Hibernate: 
    select
        addresses0_.user_id as user_id1_2_0_,
        addresses0_.addresses_id as addresse2_2_0_,
        address1_.id as id1_0_1_ 
    from
        user_addresses addresses0_ 
    inner join
        address address1_ 
            on addresses0_.addresses_id=address1_.id 
    where
        addresses0_.user_id=?
Hibernate: 
    select
        count(user0_.id) as col_0_0_ 
    from
        user user0_ 
    where
        user0_.name=?
findByNameWithPaging : [User(id=5, name=martin, email=martin@another.com, createdAt=2021-09-05T15:45:48.835077, updatedAt=2021-09-05T15:45:48.835077, addresses=[])]