はじめに
GraphQLを初めて学習しました。
GraphQLとREST APIの違いを本記事にてまとめます。
GraphQLとは?
クエリ言語の一種で、サーバーから必要なデータだけを効率的に取得できる仕組み
GraphQLの使用方法
クエリ言語と言われてもピンとこないため叩き方を見ていきます。
ユーザー名と投稿記事のタイトルを取得を例とします。
query GetUserAndPosts {
user(id: "1") {
name
posts {
title
}
}
}
上記のようにクエリを実行すると該当のデータが返却されます
{
"data": {
"user": {
"name": "太郎",
"posts": [
{ "title": "GraphQLとREST APIについて" },
{ "title": "オーバーフェッチ問題について" }
]
}
}
- クエリを使って必要なデータを具体的に指定可能
- 例: ユーザー名や投稿記事のタイトルなど
- 単一エンドポイントを使用して、複数の関連データを一度に取得
- サーバー側は、指定されたデータだけを返す
REST APIの使用方法
- 各エンドポイントにアクセスして個別にデータを取得
- 例: ユーザー情報するエンドポイントと投稿記事情報を取得するエンドポイントにアクセスして取得
- 必要なデータ以外に、余計な情報が一緒に返されることがある
- 例: ユーザー情報する際にユーザー名以外にも、メールアドレスや電話番号などの情報も返却
REST API構成例
REST APIでユーザー名と投稿記事のタイトルを取得する場合の例を見ていきます。
この例では以下のように2つのエンドポイントを用意して取得するケースが多いかと思います。
1. ユーザー情報
エンドポイント: /users/{userId}
レスポンス:
{
"id": "1",
"name": "太郎",
"email": "taro@example.com",
"phone": "123-456-7890",
"address": {
"street": "Main St",
"city": "Tokyo"
}
}
2. 投稿記事一覧
エンドポイント: /users/{userId}/posts
レスポンス:
{
"userId": "1",
"posts": [
{
"id": "101",
"title": "GraphQLとREST APIについて",
"description": "基本概念を説明した記事",
"postDate": "2025-03-06T15:30:00Z"
},
{
"id": "102",
"title": "オーバーフェッチ問題について",
"description": "オーバーフェッチとその影響について解説",
"postDate": "2025-03-05T12:00:00Z"
}
]
}
REST APIでユーザー名と投稿記事のタイトルだけを取得したい場合は
別のエンドポイントを用意しなければなりません。
エンドポイント: /users/{userId}/postsTitle
レスポンス:
{
"user": {
"name": "太郎",
"posts": [
{ "title": "GraphQLとREST APIについて" },
{ "title": "オーバーフェッチとその影響について解説" }
]
}
}
GraphQLとREST APIの違い
項目 | GraphQL | REST API |
---|---|---|
データ取得方法 | 必要なデータだけクエリで指定 | エンドポイントごとに全体を取得 |
エンドポイント数 | 単一エンドポイント | 複数エンドポイント |
過剰データ取得 | 必要なデータのみ返却(オーバーフェッチなし) | 不要なデータも返される可能性あり |
柔軟性 | 高い柔軟性を持つ | エンドポイントごとに固定されたデータ構造 |
GraphQLの主なメリット
-
単一エンドポイント
- すべての問い合わせが1つのエンドポイントで完結
-
必要最小限のデータ取得
- クエリで指定された情報のみを取得し、余計なデータを排除
-
型指定による明確性
- スキーマを利用してデータ型を明確に定義。バグ防止やコーディングの効率化に寄与
まとめ
GraphQLは柔軟性が高いのでデータ構造が複雑な場合は有効ですね
参考