※本ページにはプロモーション(広告)が含まれています
クライアントが必要なデータ項目だけを指定して1回のリクエストで取得できるAPIクエリ言語。REST APIの取りすぎ・足りない問題を解決する。
詳しい解説
GraphQLは、2015年にFacebook(現Meta)が公開したAPI向けのクエリ言語と実行ランタイムです。REST APIの『エンドポイントごとに固定のデータ構造』という制約を解消し、クライアントが欲しいフィールドだけを1回のリクエストで指定できるのが最大の特徴です。
REST APIではユーザー情報と投稿一覧が別エンドポイントになりがちで、画面表示のために3〜4回のリクエストを送る必要があることがよくあります。GraphQLなら `{ user(id: 1) { name posts { title } } }` という1回のクエリで、ユーザー名と投稿タイトルだけをまとめて取得できます。つまり『オーバーフェッチ(取りすぎ)』『アンダーフェッチ(足りない)』の両方を解消できます。
サーバー側は1つのエンドポイント(通常 `/graphql`)を公開し、クライアントのクエリを解析してスキーマに基づいたデータを返します。スキーマは型システム(SDL: Schema Definition Language)で定義され、フロントエンドとバックエンドの間で『何が取れるか』の契約として機能します。これによりツールによる自動補完やドキュメント生成も容易です。
クエリ(取得)に加え、データ変更用の『ミューテーション』、リアルタイム更新用の『サブスクリプション』も標準で備わっています。実装ライブラリとしてはApollo Server/Client、Relay、urql、GraphQL Yogaなどがあります。
一方で、キャッシュ戦略がRESTより難しい、複雑なクエリを許すと重い処理が走る(N+1問題)、ファイルアップロードが標準では難しいなどの弱点もあり、プロジェクト特性で使い分ける必要があります。
SNSアプリのプロフィール画面には『名前・アイコン・フォロワー数・直近の投稿5件』が必要だとします。RESTなら `/users/1` と `/users/1/posts?limit=5` の2回リクエストでしたが、GraphQLなら1クエリで `{ user(id:1) { name avatar followers posts(limit:5){title} } }` と書くだけ。モバイル回線の遅い環境でも読み込みが速くなり、帯域の無駄も減ります。
別の呼び方
GraphQL API
グラフQL
minto.tech スマホ(Android/iPhone)・PC(Mac/Windows)の便利情報をお届け! 月間アクセス160万PV!スマートフォン、タブレット、パソコン、地デジに関する素朴な疑問や、困ったこと、ノウハウ、コツなどが満載のお助け記事サイトはこちら!