Pageable과 Page Request
먼저 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=[])]