GraphQL

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

APIフロントエンド
GraphQL」の技術書を見る →

GraphQL とは

GraphQL は、クライアントが必要なデータだけを指定して取得できる API のクエリ言語である。Facebook (現 Meta) が 2012 年に社内向けに作り、2015 年にオープンソースとして公開した。2019 年には仕様と関連資産の管理が GraphQL Foundation (Linux Foundation 傘下) へ移り、単一ベンダーの技術ではなくなっている。REST で起きやすい Over-fetching (不要なデータまで受け取る) と Under-fetching (1 画面分を揃えるのに複数リクエストが要る) を、取得内容をクライアント側で指定できる仕組みで抑えるのが狙いだ。

REST vs GraphQL

REST と GraphQL の違いを以下にまとめる。

観点RESTGraphQL
エンドポイントリソースごとに複数単一エンドポイント
データ取得サーバーが決定クライアントが指定
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!
}

AppSyncAWS のマネージド GraphQL サービスで、DynamoDBLambda、RDS をデータソースとして接続できる。

GraphQL の注意点

GraphQL の注意点を以下にまとめる。

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

いつ GraphQL を使うか

取得するフィールドをクライアント側で決める必要があるかが、判断の軸になる。

場面選ぶ方式理由
モバイルと Web で必要なフィールドが違うGraphQLクライアントが欲しい項目を指定できるため、サーバーが返す内容が固定される REST のように使わないデータまで受け取ることがない
1 つの画面のために複数のリソースを取りに行っているGraphQL単一エンドポイントへの 1 リクエストでまとめて取得でき、Under-fetching を埋めるためのリクエストを重ねずに済む
返す項目が決まっている単純な CRUDREST指定の柔軟さが要らないうえ、GraphQL では N+1 問題やクエリの深さの制限といった手当てを別に用意することになる
HTTP キャッシュをそのまま効かせたい、ファイルをアップロードするRESTGraphQL はキャッシュに工夫が必要で、ファイルアップロードは REST を併用する形になる

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

この記事は役に立ちましたか?

関連用語

関連する記事