【比較】RESTとGraphQLの違い¶
Web API(アプリケーション間でデータをやり取りするためのインターフェース)の設計において、長らく主流であった「REST」と、Facebook(現Meta)社内で開発され、その後オープンソース化されて採用が広がっている「GraphQL」。この2つは、APIとのコミュニケーション方法において、根本的なアプローチの違いがあります。
概要¶
| 項目 | REST (Representational State Transfer) | GraphQL |
|---|---|---|
| アーキテクチャ | アーキテクチャスタイル(設計上の制約の集合) | クエリ言語+それを実行するランタイム |
| エンドポイント | 複数(リソースごとにURLが存在) | 単一(通常 /graphql のみ) |
| データ取得 | サーバー側が定義した固定のデータ構造 | クライアント側が必要なデータを指定 |
| 課題 | オーバーフェッチ/アンダーフェッチが発生しやすい | 学習コスト、複雑なクエリによる性能問題 |
| HTTPメソッド | GET, POST, PUT, DELETEなどを使い分ける | 主にPOST(仕様上は特定トランスポート非依存) |
| 型システム | なし(OpenAPIなどで仕様を別途定義) | あり(スキーマで厳密に型を定義) |
| 例えるなら | レストランのセットメニュー | アラカルト(単品注文) |
一言で言うと、RESTは「リソース(情報)ごとに用意された窓口(URL)を叩く」 アーキテクチャであり、GraphQLは「一つの大きな窓口に必要なものだけを細かく注文する」 ための言語です。
なお当サイトには「REST・gRPC・WebSocketの違い」もあります。あちらはトランスポート・ストリーミング・契約の軸の比較で、本記事(クエリ表現力/オーバーフェッチ・アンダーフェッチの軸)とは観点が異なる補完関係です。
詳細比較¶
1. REST (Representational State Transfer)¶
RESTは、Webの原則(HTTPメソッド、ステートレス性など)に基づいてシステムを設計するためのアーキテクチャスタイル(設計上の制約の集合)です。MDN も REST を「効率的・信頼性・スケーラビリティを実現するソフトウェアアーキテクチャの設計制約の集まり」と定義しており、プロトコルや標準仕様そのものではありません。「リソース」という概念が中心にあり、すべての情報(ユーザー、商品など)は一意なURL(エンドポイント)で識別されます。
主な特徴¶
- リソース指向:
/usersや/users/1のように、URLが操作対象のリソースを表します。 - HTTPメソッドの活用: リソースに対する操作をHTTPメソッドで表現します。
GET: リソースの取得POST: リソースの新規作成PUT/PATCH: リソースの更新DELETE: リソースの削除
- ステートレス: サーバーはクライアントの状態を保持せず、各リクエストは完結している必要があります。
- オーバーフェッチとアンダーフェッチ:
- オーバーフェッチ: エンドポイントが固定のデータ構造を返すため、クライアントに不要なデータまで含まれてしまう問題。例えば、ユーザー名だけ欲しいのに、
/users/1を叩くと住所や電話番号まで返ってくるケース。 - アンダーフェッチ: 欲しい情報が複数のリソースにまたがっている場合、何度もAPIを呼び出す必要がある問題。例えば、ユーザー情報とその投稿一覧を取得するために、
/users/1と/users/1/postsの2回のリクエストが必要になるケース。
- オーバーフェッチ: エンドポイントが固定のデータ構造を返すため、クライアントに不要なデータまで含まれてしまう問題。例えば、ユーザー名だけ欲しいのに、
RESTはシンプルで理解しやすく、Webの標準技術に基づいているため、多くのWebサービスで採用されています。
2. GraphQL¶
GraphQLは、APIのためのクエリ言語であり、定義した型システムを用いてクエリを実行するサーバー側ランタイムでもあります(公式定義)。クライアントが必要なデータの構造をリクエストに記述できるのが最大の特徴で、これにより、RESTが抱えていたオーバーフェッチやアンダーフェッチの問題を解決します。
主な特徴¶
- 単一エンドポイント: 通常、すべてのリクエストは単一のURL(例:
/graphql)にPOSTメソッドで送信されます(GraphQL 仕様自体は特定のトランスポートに依存しませんが、実運用では HTTP POST が一般的です)。 -
クライアント主導のデータ取得: クライアントは「クエリ」と呼ばれる要求を送信し、欲しいデータとその構造を自由に指定できます。
このクエリにより、1回のリクエストで必要なデータだけを過不足なく取得できます。 - 厳密な型システム: サーバー側で「スキーマ」を定義し、APIで扱えるデータの型や関係性を厳密に記述します。これにより、APIの仕様が明確になり、開発ツールによる支援(入力補完など)も受けやすくなります。 - 操作の分類: -
Query: データの取得(RESTのGETに相当) -Mutation: データの作成・更新・削除(POST, PUT, DELETEに相当) -Subscription: リアルタイムなデータ更新の購読
GraphQLは、特に複数のデータソースを扱う場合や、多様なクライアント(Web、モバイルアプリなど)がそれぞれ異なるデータ要件を持つ場合に強力な柔軟性を発揮します。
よくある誤解¶
- 誤解1:「REST はプロトコル/標準仕様である」 — 誤りです。REST は HTTP のようなプロトコルではなく、設計上の制約の集合(アーキテクチャスタイル)です。MDN も「a group of software architecture design constraints」と定義しています。HTTP API が慣習的に "RESTful" と呼ばれていても、必ずしも全制約を満たすわけではありません。
- 誤解2:「GraphQL は単なるデータベースのクエリ言語(SQL のようなもの)」 — 誤りです。GraphQL 公式は「a query language for your API, and a runtime for fulfilling those queries with your existing data」と定義します。特定のデータベースやストレージに紐づくものではなく、API の問い合わせ言語+実行ランタイムです。
- 誤解3:「GraphQL は HTTP/POST に固定されたプロトコル」 — 不正確です。GraphQL 仕様はトランスポート非依存で、HTTP POST は最も一般的な運用形態にすぎません。「主に POST」は実務上の傾向であって仕様上の制約ではありません。
- 誤解4:「GraphQL を使えば常にパフォーマンスが上がる」 — 誤りです。GraphQL はオーバー/アンダーフェッチを抑えられますが、無制限に深い・複雑なクエリは N+1 問題やサーバー負荷を招きます。HTTP キャッシュも REST ほど単純には効きません。トレードオフがあります。
- 誤解5:「REST と GraphQL は二者択一で、片方が新しいから優れている」 — 不正確です。両者はトレードオフ関係にあり、RESTful API の前段に GraphQL サーバーを置く併用構成も実在します。要件次第で選ぶ/併用するものです。
実務での選び分け¶
-
RESTを選ぶケース:
- APIがシンプルで、リソースの構造が固定的な場合。
- HTTPキャッシングなど、Webの標準的な仕組みを最大限に活用したい場合。
- プロジェクトメンバーがRESTに慣れ親しんでいる場合。
-
GraphQLを選ぶケース:
- クライアントごとに必要なデータが大きく異なる複雑なアプリケーション。
- モバイルアプリなど、通信量を最小限に抑えたい場合。
- 複数のマイクロサービスやデータベースからデータを集約するAPIを構築する場合。
両者はトレードオフの関係にあり、プロジェクトの要件やチームのスキルセットに応じて最適なものを選択することが重要です。RESTfulなAPIの前にGraphQLサーバーを配置し、両者を併用するアーキテクチャも存在します。
判断軸:①クライアントのデータ要件が固定的か多様か ②オーバー/アンダーフェッチを問題視するか ③HTTP キャッシュ等の Web 標準を活かしたいか ④スキーマ(型)を契約として強制したいか ⑤チームの習熟度と運用コスト。
ひとことまとめ¶
REST はリソースごとの複数エンドポイントを叩くアーキテクチャスタイル、GraphQL は単一エンドポイントへ「必要なものだけ」を問い合わせるクエリ言語+ランタイム。オーバー/アンダーフェッチとクエリ表現力の軸で選び分けます(トランスポートやストリーミングの軸は別記事 REST・gRPC・WebSocket を参照)。
出典・参考¶
- MDN「REST」(REST は効率的・信頼性・スケーラブルな分散システムを実現するソフトウェアアーキテクチャの設計制約の集合。プロトコルや標準ではない): https://developer.mozilla.org/en-US/docs/Glossary/REST
- GraphQL 公式「Introduction to GraphQL」(GraphQL は API のためのクエリ言語であり、定義した型システムでクエリを実行するサーバー側ランタイム。クライアントが必要なものだけを要求できる): https://graphql.org/learn/
- GraphQL 公式サイト(A query language for your API。単一エンドポイント・型システム・クライアント主導のデータ取得): https://graphql.org/
- MDN「HTTP request methods」(GET/POST/PUT/DELETE 等の各メソッドの意味): https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
- 当サイト「REST・gRPC・WebSocketの違い」(本記事と補完関係:トランスポート/ストリーミング/契約の軸の比較)