LinuCレベル4 システムアーキテクト システムアーキテクチャ 問17
システムアーキテクチャ/柔軟性を高めるアーキテクチャパターンモバイルアプリと管理画面Webの両方が同じバックエンドデータを利用する。モバイルは限られたフィールドだけ取得したく、管理画面は複数エンティティを組み合わせたデータを1リクエストで取得したい。この要件に最も適したAPI設計はどれか。
当サイトのオリジナル問題(LinuCレベル4 システムアーキテクトの出題範囲「システムアーキテクチャ」に対応。実際の試験問題ではありません)
- AREST APIをリソースごとに設計し、モバイルはレスポンスの不要フィールドをクライアント側で無視して使う
- Bモバイル用と管理画面用それぞれに専用のAPIサーバー(BFF)を作り、各クライアントに最適化したレスポンスを返す
- C全クライアント共通のREST APIを作り、モバイルは複数エンドポイントを順次呼び出して必要なデータを組み合わせる
- DGraphQLを採用し、クライアントがクエリで必要なフィールドと関連エンティティを指定して1リクエストで取得できるようにする
正解:D
解説
GraphQLでは、クライアントがリクエスト時に必要なフィールドと関連エンティティを宣言的に指定します。モバイルは必要最小限のフィールドだけを取得でき(オーバーフェッチなし)、管理画面は複数エンティティを1クエリで結合取得できます(アンダーフェッチなし)。エンドポイントは1つでスキーマによる型安全なインターフェースが提供されます。クライアントごとに異なるフィールドニーズへの対応が容易で、REST APIで必要になる複数エンドポイント設計の複雑さを軽減できます。
選択肢ごとの解説
- A誤り。不要フィールドをクライアント側で無視しても転送量は変わらず、モバイル回線での帯域の無駄が生じます。また複数エンティティを組み合わせた管理画面の要件に対しては複数の往復が必要になります。
- B誤り。BFFパターンはクライアントごとに最適化できますが、モバイル用・管理画面用の2つのサービスを別々に維持する必要があり、共通ロジックの重複や管理コストが増えます。
- C誤り。モバイルが複数エンドポイントを順次呼び出すとラウンドトリップが増え、モバイル回線での遅延が大きくなります。各エンドポイントが固定フィールドを返すためオーバーフェッチも生じます。
- D正しい。GraphQLではクライアントが必要なフィールドと関連エンティティをクエリで指定することで、過不足なくデータを取得できます。モバイルと管理画面で異なるクエリを使いながら、サーバー側は単一スキーマで管理できます。