API・開発の基礎用語

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の実践ステップ

  1. 利用側なら、提供元の GraphQL のスキーマと、公式の探索ツールの有無を確認する。
  2. 取得したい項目を絞り、小さなクエリから試す。
  3. 認証と、1回のクエリに許される複雑さの上限(深さ、件数)を確認する。
  4. 変更系はミューテーションとして、テスト環境で試す。
  5. 提供側なら、まず既存の画面で必要なデータを洗い出し、スキーマに落とす。
  6. 負荷の見積もりを、クエリの複雑さ単位で行う。

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・ツールの機能・料金・無料枠・仕様は頻繁に更新されるため、最新の内容は各社の公式ページでご確認ください。契約・法務・セキュリティに関する判断は、専門家や社内の担当部門にご相談ください。「筆者の見解」は一つの考え方です。