GraphQL
クライアントが必要なデータだけを指定して取得できる API クエリ言語
APIフロントエンド
GraphQL とは
GraphQL は、Facebook が 2015 年に公開した API クエリ言語で、クライアントが必要なデータだけを指定して取得できる。REST の Over-fetching (不要なデータの取得) と Under-fetching (複数リクエストが必要) を解決する。
REST vs GraphQL
REST と 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 の注意点
GraphQL の注意点を以下にまとめる。
| 注意点 | 対策 |
|---|---|
| N+1 問題 | DataLoader でバッチ化 |
| 複雑なクエリ | クエリの深さ・複雑さを制限 |
| キャッシュ | Apollo Client のキャッシュ |
| ファイルアップロード | REST と併用 |
いつ GraphQL を使うか
いつ GraphQL を使うかの判断基準を以下にまとめる。
| ケース | 推奨 |
|---|---|
| モバイル + Web で異なるデータが必要 | ✅ GraphQL |
| シンプルな CRUD API | ❌ REST で十分 |
| リアルタイム更新 | ✅ GraphQL Subscriptions |
| 公開 API | ❌ REST の方が一般的 |
理論と実装の両面から学ぶなら関連書籍が参考になる。
この記事は役に立ちましたか?
関連用語
REST API
HTTP メソッドとリソース指向の URL で設計する Web API のアーキテクチャスタイル
API Gateway
API のエントリーポイントとして認証、スロットリング、ルーティングを一元管理する AWS サービス
API バージョニング (詳解)
API の破壊的変更を管理する戦略の詳細な実装パターン
キャッシュ無効化
キャッシュされたデータが古くなった際に、最新のデータに更新または削除する仕組み
Athena
S3 上のデータを標準 SQL で直接クエリできる AWS のサーバーレス分析サービス
N+1 問題
1 回のクエリで取得したリストの各要素に対して追加クエリが発行され、クエリ数が爆発する性能問題