GraphQLとはRESTとの違いと向いている場面
GraphQLとは、必要なデータだけを指定して取得できるAPI向けのクエリ言語です。スキーマ・クエリ・ミューテーションの基本と、RESTとの違い、導入時の注意点を整理します。
公的機関・公式資料などの一次情報と照合して作成しています。このサイトについて
GraphQLとは
GraphQL とは、API のためのクエリ言語であり、データの形を型で定義する仕組みでもあります。公式サイトでは、柔軟でバージョンに縛られない API を、強い型システムによって実現するもの、と紹介されています。REST のように、リソースごとに決まった URL を呼び出すのではなく、必要なフィールドだけをクエリに書いて取得できるのが特徴です。
たとえば、顧客の名前とメールアドレスだけが欲しいのに、REST で1件取得すると、住所や契約情報まで全部返ってくることがあります。GraphQL では、欲しい項目だけを指定します。その反対に、複数のリソースをまたぐ情報を、1回の呼び出しでまとめて取得することもできます。
基本(仕組み・方法)
公式の学習ページでは、GraphQL の主な構成要素を次のように説明しています。
| 要素 | 役割 |
|---|---|
| スキーマ | データの形(型)と、使える操作を定義する設計図 |
| クエリ | データを取得する(読み取り) |
| ミューテーション | データを変更する(作成・更新・削除) |
| サブスクリプション | サーバー側の変化をリアルタイムで受け取る |
| リゾルバー | クエリに対して、実際にデータを返す処理 |
| イントロスペクション | スキーマ自体を問い合わせて調べる仕組み |
クエリの例です(顧客の名前と、直近の注文の合計だけを取得する場合)。
query {
customer(id: "4821") {
name
orders(last: 3) {
total
}
}
}
返ってくるデータは、クエリと同じ形のJSONになります。
GraphQLの具体例
REST と GraphQL の違いを、画面を1つ作る場面で比べます。顧客詳細の画面に、顧客の名前、直近3件の注文、担当者名を出したい場合です。
| 観点 | REST の一般的な例 | GraphQL の例 |
|---|---|---|
| 呼び出し回数 | 顧客、注文、担当者で3回 | 1回のクエリで取得 |
| 取得項目 | サーバー側で決まった項目が返る | 必要な項目だけ指定する |
| 窓口の数 | リソースごとにURLが多数 | 単一のエンドポイントが基本 |
| バージョン管理 | URLに版を付けることが多い | 項目の追加と非推奨化で進める考え方 |
| キャッシュ | URLとHTTPの仕組みで効かせやすい | 工夫が必要になりやすい |
呼び出し回数の目安として、一覧画面で20件の項目それぞれに詳細が必要な場合、REST では 1 + 20 = 21 回の呼び出しになるケースがあります。GraphQL では、1回で関連データごと取得する設計にできます。ただし、サーバー側で内部的に問い合わせが増える(いわゆる N+1 問題)ことがあるので、全体の負荷が減るとは限りません。
GraphQLの実践ステップ
- 利用側なら、提供元の GraphQL のスキーマと、公式の探索ツールの有無を確認する。
- 取得したい項目を絞り、小さなクエリから試す。
- 認証と、1回のクエリに許される複雑さの上限(深さ、件数)を確認する。
- 変更系はミューテーションとして、テスト環境で試す。
- 提供側なら、まず既存の画面で必要なデータを洗い出し、スキーマに落とす。
- 負荷の見積もりを、クエリの複雑さ単位で行う。
GraphQLの注意点
- 単一の窓口に、さまざまなクエリが来るため、重い問い合わせへの対策(深さの制限、件数の上限、タイムアウト)が必要です。
- HTTPのキャッシュが効きにくいことがあります。取得内容が頻繁に変わらないデータでも、設計の工夫が必要になります。
- スキーマは便利ですが、公開すると構造が分かります。認可(誰がどの項目を見られるか)は項目単位で設計します。
- 学習コストがあります。チームの経験が浅い場合、REST のほうが運用しやすい場面もあります。
GraphQLでよくあるミス
- 「GraphQL にすれば速くなる」と考え、サーバー内部の問い合わせを最適化しない。
- 認可を、入口だけで確認し、項目ごとの権限を確認しない。
- クエリを自由に書かせて、巨大なクエリで負荷が高まる。
- ミューテーションの失敗時の扱い(部分的な成功)を考えていない。
GraphQLのチェックリスト
- 取得項目の柔軟さが、本当に必要か検討したか。
- 認証・認可を、項目単位で設計しているか。
- クエリの深さ、件数、実行時間の上限があるか。
- スキーマの変更方針(項目の非推奨化の手順)を決めたか。
- 運用チームが対応できる学習コストか。
GraphQLのFAQ(よくある質問)
Q. GraphQL は REST の後継ですか。
A. 置き換えではなく、選択肢の1つです。公開APIの多くは今も REST で、GraphQL は画面ごとに必要なデータが違う場合などで選ばれます。
Q. GraphQL でも HTTP を使いますか。
A. 多くの実装では HTTP 上で提供されます。仕様はトランスポートに依存しない形で定められています。
Q. データベースの種類は関係ありますか。
A. 関係ありません。GraphQL は API の層の話で、裏側のデータの置き場所は自由です。
筆者の見解(GraphQL)
GraphQL は、データ取得の柔軟さと引き換えに、運用側へ責任を移す技術だと考えます。画面ごとに必要な項目が頻繁に変わるチームには大きな利点ですが、小規模なSaaS連携で、固定した項目だけを読むのであれば REST で十分です。私見では、選ぶ基準は流行ではなく、変更の頻度と、運用できる人の数です。
GraphQLの関連項目
出典(一次情報)
本記事は一般的な情報の提供を目的としています。SaaS・ツールの機能・料金・無料枠・仕様は頻繁に更新されるため、最新の内容は各社の公式ページでご確認ください。契約・法務・セキュリティに関する判断は、専門家や社内の担当部門にご相談ください。「筆者の見解」は一つの考え方です。