GraphQLはFacebookが開発したAPIクエリ言語です。RESTと異なり、クライアントが「欲しいフィールドだけ」を1リクエストで取得できるため、オーバーフェッチ・アンダーフェッチの問題を解決します。
| 比較項目 | REST API | GraphQL |
|---|---|---|
| エンドポイント | リソースごとに複数 | 単一(/graphql) |
| データ取得 | 固定レスポンス形式 | 必要なフィールドのみ指定 |
| オーバーフェッチ | 起きやすい | ほぼなし |
| 型安全 | OpenAPIで補完 | スキーマで型定義必須 |
| リアルタイム | WebSocketで別途実装 | Subscriptionで標準対応 |
| 学習コスト | 低 | 中(スキーマ設計が必要) |
# 必要なフィールドだけ指定して取得 query GetUser { user(id: "42") { id name email posts { title createdAt } } } # RESTなら /users/42 と /users/42/posts の2回リクエストが必要だった部分を1回で取得
mutation CreatePost($title: String!, $body: String!) {
createPost(input: {{ title: $title, body: $body }}) {
id
title
createdAt
}
}
type User { id: ID! name: String! email: String! posts: [Post!]! } type Post { id: ID! title: String! body: String! createdAt: String! author: User! } type Query { user(id: ID!): User posts: [Post!]! } type Mutation { createPost(input: CreatePostInput!): Post! }
「複数クライアント(Web/モバイル)が異なるデータ形式を必要とする」「フロントエンドが頻繁に変わる」「関連データをネストして1回のリクエストで取得したい」ケースに向いています。小規模な単純なCRUDアプリやシンプルなBFFにはREST APIの方がシンプルで管理しやすいこともあります。
はい、ナイーブな実装だとN+1問題が発生します。解決策として「DataLoader」パターン(バッチ処理でDB呼び出しをまとめる)が広く使われています。Node.js(Apollo/DataLoader)・Python(Strawberry/graphene)等の主要ライブラリはDataLoaderをサポートしています。
使えます。多くの実務プロジェクトでは既存のREST APIをラップしてGraphQLレイヤーを追加する「GraphQL as BFF」パターンを採用しています。Apolloの「Apollo Federation」を使えば複数のマイクロサービスのGraphQLスキーマを統合することも可能です。