ブログ

【SAP BTP】SuccessFactors APIにおけるページネーション解説[$top/$skip][paging=cursor][paging=snapshot]の使い分け

この記事をSNSでシェア!

はじめに

SAP BTPとSAP SuccessFactorsとの連携でWebAPIの「OData」で開発を行う際、データ取得処理を行うにあたってページネーション(大量のデータを分割して取得するデータ取得方法)について考慮することは必要不可欠です。

ページネーションについての理解が浅いまま開発を進めていくと、以下の記事で紹介したように思わぬ問題につながりかねません。
【SAP BTP】【SuccessFactors】データ取得条件「$top=1000」は必ずしも1000件のレコードを返却するとは限らない

本記事ではSAP SuccessFactors APIにおけるページネーションについて、まだ理解が浅い方やこれから開発を始めようとされる方に向けて解説いたします。

ページネーションについて

ページネーションとは、データを分割して取得するデータ取得方法のことを指します。
通常、1回のGETリクエストで取得されるデータ件数は最大1000件となっています。しかし、複雑なクエリやデータサイズが大きい場合、タイムアウトに陥る可能性があるためページネーションを考慮し、1リクエストでの取得件数を調整することは必須です。

SAP SuccessFactors APIでは、ページネーションとして「クライアント側のページネーション」と「サーバ側のページネーション」が用意されています。

次項より、それぞれで使用されているパラメータの紹介とそれぞれのメリットとデメリットを解説いたします。

クライアント側のページネーション

クライアント側のページネーションのパラメータとして「$top」と「$skip」というパラメータが存在しており、これらを組み合わせることでページングを行うことが可能です。

データセットの始まりから、$skipで指定した数を除き、$topに指定する数値分データ取得を行うことが可能です。($top/$skipの詳細な説明は別記事の「【SAP BTP】【SuccessFactors】データ取得条件「$top=1000」は必ずしも1000件のレコードを返却するとは限らない」をご確認ください。)

$top / $skip
メリットデメリット
 ・初期ページの読み込みが早い
 ・SAP UI5のリストやテーブルと連動させることに向いている
 ・$skipの値を変動させることで前のページに戻ることができる(逆スクロールが可能)
 ・各ページごとにデータ取得クエリを実行するため、非効率的
 ・データ取得中にデータの削除、追加などが行われた場合、データの損失や重複が起こり得る

※データの重複を回避するために、$orderby(並び順を指定するパラメータ)を設定することが推奨されています。

サーバ側のページネーション

スクロールのたびにテーブルデータを読み込むような、UIの処理にて推奨されるクライアント側のページネーションに対し、サーバー側のページネーションと呼ばれるパラメータが存在します。

サーバー側のページネーションのためのパラメータには「paging=cursor」と「paging=snapshot」という2種類が用意されています。

paging=cursorとpaging=snapshot

これらのパラメータはいずれもサーバ側でページネーションを制御するためのパラメータです。
いずれのパラメータも返却値に次ページがある場合「__next」というパラメータを返却し「$skiptoken」という値を参照することで残りのレコード取得が可能となります。

paging=cursorのメリット・デメリット
メリットデメリット
 ・取得時にデータの重複や、損失が発生しない
 ・$top / $skipでのページネーションよりも高速で行われる
 ・$orderby(並べ替えのパラメータ)と併用不可
 ・一部エンティティにおいて、$filter(取得条件の設定用パラメータ)と併用不可
 ・次ページ取得後、前のページに戻ることができないため、UIの使用に不向き
paging=snapshotのメリット・デメリット
メリットデメリット
 ・大容量データを扱う複雑なクエリに対してパフォーマンスを向上させられる
 ・取得時にデータの重複や、損失が発生しない
 ・$filterと$orderbyと併用可
 ・膨大な量のデータに対して複雑なクエリをする場合、タイムアウトを起こす可能性がある
 ・次ページ取得後、前のページに戻ることができないため、UIの使用に不向き

選択方法

以下にSAP SuccessFactors API Reference Guideに記載されているページネーションの選択方法についてまとめます。

$top / $skippaging=cursorpaging=snapshot
リアルタイムでデータを読み込み、スクロールに応じてUIに表示するような機能を実装する場合に推奨クライアント側のページネーションより高速のためバックグラウンド処理での大量データ取得で推奨大量のデータや複雑なクエリを扱う場合に推奨
パフォーマンスに問題がある場合は「paging=cursor」を使用することが求められる

おわりに

SAP BTPとSAP SuccessFactorsとの連携でWebAPIの「OData」で開発を行う際、ページネーションを考慮することは必要不可欠です。
今回解説いたしました通り、ページネーションにはクライアント側とサーバ側でそれぞれメリットとデメリットがあり、用途に応じて適切に使用することが求められます。

公式リファレンスを確認してわかった気になっていましたが「$topに指定した値と返却される件数が異なる」という事象に直面するまで詳細に調査を行うことがなく、事象の原因解明に時間を要しました。

開発を行うにあたって、ページネーションについて考慮する際に本記事が参考となれば幸いです。

投稿者プロフィール

松井 律
松井 律
2021年入社、BS事業部BSグループに所属。
SAP BTPでのSide-By-Side開発に携わっています。
開発業務を通じて得たSAP BTPの技術に関する記事を投稿していければと思います。
この記事をSNSでシェア!