[Spring Boot] JPA 페이징 구현하기 (Pageable 객체)

손은실·2024년 7월 19일
0

Spring Boot

목록 보기
6/13
post-custom-banner

사용자가 저장한 책을 리스트로 반환하는 기능을 개발하던 중에 페이징 기능을 추가하여 모든 값을 한 번에 보내지 않고, N개씩 값을 반환해야겠다는 생각을 했습니다.

해당 포스팅의 실제 코드는 EunsilSon - BookMarky에서 확인할 수 있습니다.



Paging이란?

페이징이란 사용자가 요청한 데이터에 해당되는 전체 데이터 중 일부만을 전달하는 방식입니다.
Pageable 인스턴스를 쿼리 메서드에 전달해 정적으로 정의된 쿼리에 동적 페이징을 추가할 수 있습니다.

  • Pageable은 인터페이스로, 실제 사용할 때는 PageRequest 객체를 사용
  • PageRequest 생성자는 page, size, sort를 파라미터로 사용

클라이언트에게 URL의 파라미터로 page를 받고, Pageable 객체를 생성하는 페이징 기능을 설계했습니다. size는 고정 값을 사용하기 위해 파라미터로 받지 않았습니다.

  • page: 페이지 번호, 0부터 시작
  • size: 한 페이지 당 받을 데이터 개수
  • sort: 특정 필드를 기준으로 오름차순/내림차순 정렬


페이징 구현하기

🟢 Controller

Pageable 객체 생성에 필요한 파라미터 page 를 받습니다.
데이터 개수는 6개로 고정하기 위해 받지 않았습니다.

“/books/{username}?page={페이지}” 으로 요청을 보내면 페이징된 결과를 반환하게 됩니다.



🟢 Service

  1. 받은 파라미터로 Pageable 객체를 생성합니다.

    Pageable pageable = PageRequest.of(페이지, 사이즈, 정렬 정보)
    • 사이즈는 6, 정렬 정보는 "date" 라는 이름을 가진 필드를 기준으로 내림차순 정렬합니다.
  2. 서비스에서 특정 사용자가 저장한 Book Id의 페이징 결과를 Page에 담습니다.

  3. Page에 담긴 UserBookRecord에서 Book의 isbn을 for-each 문으로 하나씩 꺼내, 실제 Book 엔티티를 찾고 반환을 위한 List<Book>에 담습니다.


  • UserBookRecord 엔티티


🟢 Repository

Pageable 객체의 정보를 토대로 페이징 결과를 반환합니다.



테스트

  • UserBookRecord 테이블

user_id 가 1인 사용자가 저장한 책을 조회해보겠습니다.


  • Postman

날짜 기준 내림차순 정렬을 한대로 book_id = 9인 데이터가 첫번째에 오는 것을 확인할 수 있습니다.

post-custom-banner

0개의 댓글