GraphQL

クライアントが必要なデータだけを指定して取得できる API クエリ言語

APIフロントエンド

GraphQL とは

GraphQL は、Facebook が 2015 年に公開した API クエリ言語で、クライアントが必要なデータだけを指定して取得できる。REST の Over-fetching (不要なデータの取得) と Under-fetching (複数リクエストが必要) を解決する。

REST vs GraphQL

観点 REST GraphQL
エンドポイント リソースごとに複数 単一エンドポイント
データ取得 サーバーが決定 クライアントが指定
Over-fetching 発生する 発生しない
Under-fetching 複数リクエストが必要 1 リクエストで取得
キャッシュ HTTP キャッシュが容易 工夫が必要

クエリの例

# クライアントが必要なフィールドだけ指定
query {
  user(id: "123") {
    name
    email
    orders(limit: 5) {
      id
      total
      status
    }
  }
}
{
  "data": {
    "user": {
      "name": "Alice",
      "email": "alice@example.com",
      "orders": [
        { "id": "o1", "total": 1000, "status": "completed" }
      ]
    }
  }
}

スキーマ定義

type User {
  id: ID!
  name: String!
  email: String!
  orders(limit: Int): [Order!]!
}

type Order {
  id: ID!
  total: Int!
  status: String!
}

type Query {
  user(id: ID!): User
  orders(userId: ID!): [Order!]!
}

type Mutation {
  createOrder(input: CreateOrderInput!): Order!
}

AppSync は AWS のマネージド GraphQL サービスで、DynamoDB、Lambda、RDS をデータソースとして接続できる。

GraphQL の注意点

注意点 対策
N+1 問題 DataLoader でバッチ化
複雑なクエリ クエリの深さ・複雑さを制限
キャッシュ Apollo Client のキャッシュ
ファイルアップロード REST と併用

いつ GraphQL を使うか

ケース 推奨
モバイル + Web で異なるデータが必要 ✅ GraphQL
シンプルな CRUD API ❌ REST で十分
リアルタイム更新 ✅ GraphQL Subscriptions
公開 API ❌ REST の方が一般的

理論と実装の両面から学ぶなら関連書籍が参考になる。

関連用語