クイズの説明
Step 4で学んだ内容の理解度をチェックします。
- 全8問
- 合格ライン: 80%(7問正解)
- 不合格の場合は復習してから再挑戦してください
問題
Q1. GraphQLがRESTの課題として解決するものはどれですか?
- A) データベースの正規化
- B) Over-fetching(不要なデータの取得)とUnder-fetching(データ不足)
- C) サーバーのスケーラビリティ
- D) HTTPプロトコルの互換性
答えを見る
正解: B
RESTでは、エンドポイントごとにレスポンスの形式が固定されるため、クライアントが必要としない情報も含まれる(Over-fetching)ことがあります。また、必要な情報を得るために複数のエンドポイントにリクエストが必要になる(Under-fetching)こともあります。GraphQLではクライアントが必要なフィールドだけを指定できるため、これらの問題を解決します。
Q2. GraphQLの Mutation に相当するRESTの操作はどれですか?
- A) GET のみ
- B) POST, PUT, PATCH, DELETE
- C) HEAD のみ
- D) OPTIONS のみ
答えを見る
正解: B
GraphQLの操作は3種類に分類されます:
- Query → RESTのGETに相当(データ取得)
- Mutation → RESTのPOST, PUT, PATCH, DELETEに相当(データ変更)
- Subscription → WebSocketによるリアルタイム通知
Q3. N+1問題の説明として正しいのはどれですか?
- A) 1つのクエリが1+N回のHTTPリクエストを生成する問題
- B) リスト取得の1回目のクエリに加え、各アイテムごとに追加のDBクエリが発行される問題
- C) N個のサーバーに1回ずつリクエストを送信する問題
- D) 1つのテーブルにN+1個のインデックスが必要な問題
答えを見る
正解: B
N+1問題とは、リスト取得の1回のクエリ(1)に加えて、リスト内の各アイテムに対して関連データを取得するためのクエリがN回発行される問題です。例えば、10件のタスクを取得した後、各タスクの担当者情報を個別に取得すると、合計11回のDBクエリが発行されます。
Q4. DataLoaderが解決する方法として正しいのはどれですか?
- A) すべてのデータをメモリにキャッシュする
- B) 同一イベントループ内の複数のload要求をバッチ処理し、1回のDBクエリにまとめる
- C) クエリを非同期に実行してパフォーマンスを向上させる
- D) データベースのインデックスを自動作成する
答えを見る
正解: B
DataLoaderは、同一のイベントループ内で発生した複数のload()呼び出しを集約し、1回のバッチリクエスト(例: SELECT ... WHERE id IN (...) )にまとめます。これにより、N+1問題を解決できます。また、リクエスト内でのキャッシュも行い、同じIDの重複取得も防ぎます。
Q5. GraphQLのスキーマで String! の ! が意味するのはどれですか?
- A) フィールドが非推奨であること
- B) フィールドがnullにならないこと(非null必須)
- C) フィールドが一意であること
- D) フィールドが読み取り専用であること
答えを見る
正解: B
! は非null修飾子で、そのフィールドの値が必ず存在する(nullにならない)ことを保証します。
String!→ 必ず文字列が返るString→ 文字列またはnullが返る[String!]!→ 非nullの文字列の非null配列
Q6. GraphQLのキャッシュが困難な理由はどれですか?
- A) GraphQLはHTTPSを使わないため
- B) すべてのリクエストがPOSTメソッドで同じエンドポイントに送信されるため
- C) GraphQLのレスポンスが暗号化されるため
- D) GraphQLがWebSocketを使用するため
答えを見る
正解: B
RESTではGETリクエストの結果をURLベースでキャッシュできます。しかしGraphQLではすべてのリクエストがPOSTメソッドで /graphql という単一エンドポイントに送信されるため、HTTPレベルのキャッシュ(CDN等)が困難です。対策として、APQ(Automatic Persisted Queries)やApollo Client等のクライアントサイドキャッシュを使用します。
Q7. GraphQLでバージョニングの代わりに使われるアプローチはどれですか?
- A) URLにバージョン番号を付ける
- B) @deprecated ディレクティブでフィールドを段階的に廃止する
- C) 新しいサーバーを立てる
- D) クエリパラメータでバージョンを指定する
答えを見る
正解: B
GraphQLでは、URLベースのバージョニングは行いません。代わりに:
- 新しいフィールドを追加(既存クエリに影響なし)
- 古いフィールドに
@deprecated(reason: "Use 'newField' instead")を付ける - 利用状況を監視し、使われなくなったらスキーマから削除
この方式により、破壊的な変更を避けながらAPIを進化させることができます。
Q8. 以下の場面で最もGraphQLが適しているのはどれですか?
- A) サードパーティ開発者向けの公開API
- B) 複雑なダッシュボード画面で複数のデータソースからデータを取得する場面
- C) シンプルなCRUD操作のみのバックエンドAPI
- D) マイクロサービス間の内部通信
答えを見る
正解: B
GraphQLは、複雑なUIで複数のデータソースからデータを取得する場面で最も威力を発揮します。1回のリクエストで必要なデータだけを取得でき、Over-fetching/Under-fetchingを解決できます。
- 公開API → RESTが標準的で理解しやすい
- シンプルなCRUD → RESTで十分
- マイクロサービス間 → REST/gRPCがシンプルで高速
結果
7問以上正解の場合
合格です。おめでとうございます。
Step 4「GraphQLの可能性を探ろう」を完了しました。 次は Step 5「APIバージョニングと進化戦略」に進みましょう。
6問以下の場合
もう少し復習しましょう。
| 問題 | 復習セクション |
|---|---|
| Q1, Q2 | step4_1 GraphQLの基本概念 |
| Q3, Q4 | step4_3 N+1問題とDataLoader |
| Q5 | step4_2 スキーマ設計とリゾルバー |
| Q6, Q7, Q8 | step4_4 REST vs GraphQL |
推定所要時間: 30分