Webアプリケーションを開発する際、フロントエンドとバックエンドの間でデータをやり取りするためにAPIは欠かせません。
その中でも広く利用されているのが REST API と GraphQL です。
どちらもWebサービスのデータ取得に利用できますが、設計思想や得意なユースケースは大きく異なります。
本記事では、REST APIとGraphQLの基本的な違いを整理し、どのようなケースで使い分けるとよいかを紹介します。
REST APIとは
RESTは、リソースをURLで表現し、HTTPメソッドを使って操作する考え方です。
例えばユーザー情報を取得する場合、以下のようなAPI設計になります。
GET /users/123
ユーザーの記事一覧を取得する場合:
GET /users/123/posts
データを更新する場合:
PUT /users/123
REST APIでは、HTTPの仕組みをそのまま利用しやすい点が特徴です。
REST APIのメリット
RESTには以下のような利点があります。
- 構造が理解しやすい
- HTTPキャッシュを利用しやすい
- 多くのフレームワークが対応している
- エンドポイント単位で責務を分けやすい
- デバッグしやすい
小規模から中規模のWebサービスでは、RESTだけで十分なケースも多くあります。
RESTで起こりやすい問題
一方、画面が複雑になると複数のAPIを呼び出す必要が出てきます。
例えばプロフィール画面で、
- ユーザー情報
- 投稿一覧
- フォロワー
- 通知
を表示したい場合、次のような複数リクエストが必要になるかもしれません。
GET /users/123
GET /users/123/posts
GET /users/123/followers
GET /users/123/notifications
これを一般的に「Over Fetching」や「Under Fetching」の問題として考えることがあります。
必要以上のデータが返される場合もあれば、一画面を表示するために複数の通信が必要になる場合もあります。
GraphQLとは
GraphQLでは、クライアント側が必要なデータを指定して取得できます。
例えば次のようなクエリを書きます。
query {
user(id: "123") {
name
email
posts {
title
}
}
}
必要なフィールドだけ指定できるため、画面ごとに柔軟なデータ取得が可能です。
GraphQLのメリット
GraphQLの代表的なメリットは以下です。
- 必要なデータだけ取得できる
- 複数のデータを一度に取得しやすい
- 型情報を利用できる
- フロントエンド主導でデータ構造を指定できる
- API仕様をスキーマとして管理できる
複雑なUIや複数クライアントを持つサービスでは特に便利です。
GraphQL Schemaの例
簡単なGraphQL Schemaは以下のようになります。
type User {
id: ID!
name: String!
email: String!
posts: [Post!]!
}
type Post {
id: ID!
title: String!
}
type Query {
user(id: ID!): User
}
型が明確に定義されているため、フロントエンドとバックエンドの認識を合わせやすいというメリットがあります。
RESTとGraphQLの比較
| 項目 | REST | GraphQL |
|---|---|---|
| データ取得 | エンドポイント単位 | Queryで指定 |
| データ量 | API側で固定 | クライアントが指定 |
| キャッシュ | HTTPキャッシュと相性が良い | 専用設計が必要 |
| 学習コスト | 比較的低い | やや高い |
| 型情報 | 必須ではない | Schemaで管理 |
| 複雑な画面 | 複数APIになりやすい | 一つのQueryにまとめやすい |
どちらが常に優れているというわけではありません。
サービスの構造によって適切な選択が変わります。
RESTが向いているケース
次のような場合はRESTが扱いやすいでしょう。
- API構造がシンプル
- CRUD中心のサービス
- HTTPキャッシュを活用したい
- チームがRESTに慣れている
- 外部公開APIを提供する
例えばシンプルな管理画面やCMSでは、RESTの方が設計・運用しやすい場合があります。
GraphQLが向いているケース
一方、次のような場合はGraphQLが便利です。
- UIが複雑
- モバイルとWebで必要なデータが異なる
- 複数のAPIをまとめたい
- フロントエンド開発の速度を高めたい
- データ構造が頻繁に変化する
特にSPAやモバイルアプリでは、必要なデータだけ取得できる点が大きなメリットになります。
パフォーマンス面で注意すること
GraphQLは必要なデータだけ取得できるため効率的に見えますが、バックエンド側では注意が必要です。
例えば次のようなQueryがあります。
query {
users {
name
posts {
title
}
}
}
実装方法によっては、ユーザーごとにデータベースへQueryが発生する「N+1問題」が起きる可能性があります。
そのため、
- DataLoader
- Batch Query
- Cache
などを利用して、データベースアクセスを最適化する必要があります。
API Securityも忘れない
RESTでもGraphQLでも、APIを公開する場合はセキュリティ対策が必要です。
代表的な対策として、
- Authentication
- Authorization
- Rate Limiting
- Input Validation
- HTTPS
- Logging
などがあります。
GraphQLの場合はQuery ComplexityやDepth Limitも重要です。
例えば非常に深いQueryを許可すると、サーバー負荷が増える可能性があります。
デジタルプラットフォームで考えるAPI設計
ユーザー画面に多くの情報を表示するデジタルサービスでは、API設計がフロントエンドの開発効率やパフォーマンスに大きく影響します。
例えば、JLPH Philippines のようなデジタルプラットフォームを技術的なケースとして考える場合、ユーザープロフィール、コンテンツ情報、通知、履歴など複数のデータをどのように取得するかによって、RESTとGraphQLの選択が変わります。
重要なのは流行している技術を採用することではなく、
「どのデータを、どのクライアントが、どの頻度で必要とするのか」
を整理してからAPI方式を決めることです。
ハイブリッド構成も選択肢
実際のシステムではRESTかGraphQLのどちらか一方に統一する必要はありません。
例えば、
Public API
↓
REST
Internal Web Application
↓
GraphQL
File Upload
↓
REST
Realtime Feature
↓
WebSocket
のように用途ごとに技術を使い分ける方法もあります。
システム全体を見て最適な通信方式を選ぶことが重要です。
まとめ
RESTとGraphQLには、それぞれ異なるメリットがあります。
RESTは、
- シンプル
- 理解しやすい
- HTTPとの相性が良い
という特徴があります。
GraphQLは、
- 必要なデータだけ取得できる
- 複雑なUIに対応しやすい
- Schemaによる型管理ができる
という特徴があります。
API設計では、「どちらが新しいか」ではなく、サービスの要件やチーム構成、運用コストを考えて選択することが重要です。
最適なAPIは、技術そのものではなく、実際のユーザー体験と開発効率のバランスによって決まります。