lvncerpedia

REST vs GraphQL

GraphQLはAPIのクエリ言語で、「欲しいデータの形を自分で指定できる」のが最大の違い!

【REST】
Client          Server
  |  GET /users/1    |
  |----------------->|
  |  { id, name,     |  ← 要らないフィールドも全部来る
  |    email, age,   |     (Over-fetching)
  |    address... }  |
  |<-----------------|

  |  GET /users/1/posts  |  ← 関連データは別リクエスト
  |--------------------->|    (Under-fetching → N+1問題)
  |<---------------------|

【GraphQL】
Client              Server
  |  query {            |
  |    user(id: 1) {    |  ← 欲しいフィールドだけ指定
  |      name           |
  |      posts { title }|  ← 関連データも1発
  |    }                |
  |  }                  |
  |-------------------->|
  |  { user: {          |  ← ピッタリのデータだけ返ってくる
  |    name: "...",     |
  |    posts: [...] }}  |
  |<--------------------|

比較表

RESTGraphQL
エンドポイントリソースごとに複数/graphql 1本
データ取得サーバー側が決めるクライアントが指定
過剰取得起きやすい起きない
複数リソース複数リクエスト必要1リクエストでOK
学習コスト低い高め
キャッシュHTTP標準で楽工夫が必要
型システムなし(OpenAPIで補完)スキーマで強力に定義

操作の種類

Query     → データ取得 (GETに相当)
Mutation  → 作成・更新・削除 (POST/PUT/DELETEに相当)
Subscription → リアルタイム更新 (WebSocket的なやつ)

結局どっちを使えばいい?

GraphQL向き              REST向き
─────────────────        ─────────────────
・フロントが複数種類      ・シンプルなCRUD
  (Web/App/etc)          ・公開API
・データ構造が複雑        ・キャッシュ重視
・フロント主導開発        ・チームがREST慣れてる