0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

REST APIとGraphQLの違いを整理する:Webサービス設計でどう使い分けるべきか

0
Posted at

Webアプリケーションを開発する際、フロントエンドとバックエンドの間でデータをやり取りするためにAPIは欠かせません。

その中でも広く利用されているのが REST APIGraphQL です。

どちらも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は、技術そのものではなく、実際のユーザー体験と開発効率のバランスによって決まります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?