SpringのPageableとSortでページング一覧APIを最短実装!初心者向け完全ガイド
生徒
「Spring Bootで一覧APIを作るときに、データをページ分けしたいんですけど、どうすればいいですか?」
先生
「SpringにはPageableとSortという便利な機能があって、それを使えば簡単にページング処理やソートが実装できますよ。」
生徒
「えっ、それってController側に全部書くんですか?」
先生
「いい質問ですね。実はSpring Data JPAと組み合わせると、リポジトリレイヤーでも簡潔に書けるんです。さっそく一緒に実装してみましょう!」
1. Pageableとは?ページング処理の基本
Spring FrameworkやSpring Bootで一覧データを扱うとき、すべてのレコードを一度に返すのは非効率です。特にデータ件数が多くなると、レスポンスのサイズが大きくなり、APIのパフォーマンスやユーザー体験に影響が出てきます。
その解決策としてよく使われるのが、ページング機能です。SpringではPageableインターフェースを使えば、何件目から何件取得するかといった情報を簡単に指定できます。
さらに、フロントエンドと連携する場合でも、page(ページ番号)、size(ページサイズ)、sort(ソート条件)といったクエリパラメータをURLに追加するだけで、柔軟にページングが可能になります。
2. Spring Data JPAでPageableを使う方法
Spring Data JPAでは、リポジトリのインターフェースにPageableを引数として渡すだけで、自動的にページング処理が適用されます。
public interface BookRepository extends JpaRepository<Book, Long> {
Page<Book> findAll(Pageable pageable);
}
そしてControllerでPageableを受け取ると、クエリパラメータに応じたページング処理が実現できます。
@RestController
@RequestMapping("/books")
public class BookController {
private final BookRepository bookRepository;
public BookController(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
@GetMapping
public Page<Book> getBooks(Pageable pageable) {
return bookRepository.findAll(pageable);
}
}
例えば、/books?page=0&size=5のように呼び出すと、最初の5件が取得されます。
3. Sortを使った並び順の変更
並び順(ソート)も、Sortを通じてPageableに組み込むことができます。ユーザー一覧をname昇順で表示したい場合、?sort=name,ascとするだけです。
複数条件のソートも可能で、?sort=name,asc&sort=id,descと指定することで、まず名前の昇順、その次にIDの降順になります。
リクエストURL例:
/books?page=1&size=10&sort=publishedDate,desc
4. デフォルト値の指定やバリデーションを加える方法
Pageableの初期値を指定したい場合は、@PageableDefaultアノテーションを使うことで、デフォルトのページサイズやソート条件を設定できます。
@GetMapping("/books/default")
public Page<Book> getBooksDefault(
@PageableDefault(size = 5, sort = "title", direction = Sort.Direction.ASC)
Pageable pageable) {
return bookRepository.findAll(pageable);
}
このようにしておくと、クエリパラメータが指定されなかった場合でも、安定したレスポンスが返せます。
5. ページングレスポンスの中身を理解しよう
Page<T>型の戻り値には、対象のデータだけでなく、ページ全体に関するメタ情報も含まれています。
- content:現在のページのデータリスト
- totalElements:全件数
- totalPages:総ページ数
- number:現在のページ番号
- size:ページサイズ
- first / last:先頭ページか末尾ページかの判定
この情報を使えば、「次へ」「前へ」などのページネーションリンクも実装しやすくなります。
6. REST APIでページングとソートを活用する実例
実務では、検索や一覧画面において、ページングとソートを同時に扱うことが一般的です。
Spring BootでREST APIを作成する際は、以下のようなリクエストURLが実際に使われます。
/books?page=2&size=20&sort=author,desc
APIの戻り値はJSON形式で、フロントエンドに渡しやすく、AngularやReact、Vue.jsなどとも相性抜群です。
7. ページングとソートをカスタムクラスに変換する
Page<T>はそのままだと使いにくい場合もあるため、レスポンスを独自DTO(Data Transfer Object)に変換するのもおすすめです。
例えば、以下のようなレスポンス構造に変換できます:
public class BookPageResponse {
private List<BookDto> content;
private int currentPage;
private int totalPages;
private long totalElements;
// getter/setter 略
}
8. PageableとSortを使うときの注意点
最後に、ページングとソートを使う際のよくある落とし穴を整理しておきます。
- ソート対象のフィールド名が間違っていると実行時エラーになる
- デフォルトページサイズが大きすぎるとレスポンスが重くなる
- ソート条件がユーザー入力のままだとSQLインジェクションの可能性も
こうしたリスクを避けるには、制限を設ける・ログ出力を強化する・明示的なバリデーションを加えることが推奨されます。