【ぐらふきゅーえる】

GraphQL とは?

最終更新:
💡 APIが公開する項目から、必要なデータを選んで問い合わせる

APIが公開する型とフィールドの範囲で、クライアントが必要な項目を指定するクエリ言語と、その要求を実行する仕組み。返す項目は選べるが、アクセス権やサーバー側のデータ取得処理も必要になる。

📌 このページのポイント
公開された項目を選んで問い合わせる 利用側 API 項目を選んで要求 選んだ形の結果 クエリの例 { user { name } } 名前を選ぶ 成功した結果の例 data → user name: "Ken" emailは含めない スキーマの公開範囲・利用権限内 一つの要求 ≠ DBアクセス一回
APIが公開したuser/nameを要求する概念例。成功時のdata以下の構造を簡略表示。RESTの設計との優劣や、常に一回で取得できることを保証する図ではない。
ひよこ ひよこ
何を指定するの?
ペンギン先生 ペンギン先生
例えばユーザーの名前だけが必要なら、公開されたuserのnameという項目を選ぶよ。成功した結果はdataの下に要求に沿った形で返る。emailを選ばなければ、その項目は結果に含めない。ただし、公開していない項目を自由に追加して取ることはできないんだ。
ひよこ ひよこ
スキーマがあれば安全なの?
ペンギン先生 ペンギン先生
スキーマは、要求できる項目やその型を定めるものだよ。要求はその定義に照らして検証される。ただし、誰にどの情報を見せるかという認可は別に実装する。型の定義だけで秘密の情報が保護されるわけではないんだ。
ひよこ ひよこ
RESTなら必ず余計なデータが来る?
ペンギン先生 ペンギン先生
返す内容はそのAPIの設計によるよ。GraphQLではクライアントが項目を選び、関連するデータも一つの要求にまとめられる。だからといって、あらゆるREST APIより転送量や処理時間が小さくなる保証はない。必要な項目と実際の負荷を見て判断するんだ。
ひよこ ひよこ
一つの要求ならDBアクセスも一回?
ペンギン先生 ペンギン先生
別の話だよ。例えばユーザー一覧を一回取得し、各ユーザーの投稿を個別に取得すると、人数Nに対して追加N回のアクセスが起きることがある。これがN+1問題。まとめて取得する設計やDataLoaderなどで対処するが、すべての実装で必ずそのライブラリが必要とは限らないよ。
ひよこ ひよこ
運用では何を考えるの?
ペンギン先生 ペンギン先生
キャッシュを使う方法や、一覧の件数、要求の深さ・広さ・複雑さを制限する方法を考えるよ。取得項目を減らしても、サーバー内部の負荷が自動的に減るとは限らない。認可や実行時のエラーへの対応も含めてAPIを設計するんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「GraphQL」って出てきたら「APIが公開する項目から、必要なデータを選んで問い合わせる」と思えばだいたいOK!
📖 おまけ:英語の意味
「GraphQL」 = データの関連をたどるクエリ言語
💬 関連するオブジェクトのフィールドをたどって要求を組み立てるよ。グラフ専用データベースが必須という意味ではない。

参考資料

← 用語集にもどる