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 の方が一般的 |
理論と実装の両面から学ぶなら関連書籍が参考になる。