GraphQL
Overview
GraphQLはAPI用のクエリ言語であり、データに定義した型システムを使用してクエリを実行するためのサーバーサイドランタイム。
GraphQL仕様は2015年にオープンソース化され以来、様々なプログラミング言語に実装されている。
GraphQLは特定のデータベースやストレージエンジンに縛られることなく、既存のコードとデータに基づいて動作する。
GraphQLはただのクエリの構文(言語)ではなく、サーバーでクエリを受け取ってデータを返すまでの動作を担う「実行環境」そのものも含んでいる。
つまり「GraphQLはAPI用のクエリ言語であり、**それを実行するサーバー側の仕組み(ランタイム)**も一緒に提供される」という意味。
GraphQL 動作するランタイム
GraphQLは様々なプログラミング言語で実装されており、以下のようなサーバーサイドランタイムが存在する。
- JavaScript(Node.js)
- Python
- Ruby
- Java
- Go
- PHP
- その他
- C#, Elixir, Rust など、さまざまな言語で実装があります。
GraphQLとREST APIの違い
GraphQLとREST APIはどちらもAPIを提供する手段だが、いくつかの重要な違いがある。
| 項目 | REST API | GraphQL |
|---|---|---|
| エンドポイント | リソースごとに複数のエンドポイントを用意する必要がある | 単一のエンドポイント(/graphqlなど)を通してリクエストする |
| データ取得量 | 過剰取得(Over-fetching)や不足取得(Under-fetching)が起こりやすい | 必要なデータだけをクエリで指定できる |
| 型システム | APIレスポンスはドキュメント化されていないことが多い | スキーマ(型)を明示的に定義し、クライアントが知ることができる |
| 柔軟性 | 固定的なレスポンスフォーマット | クライアントが欲しいデータの構造を指定できる |
| バージョニング | エンドポイントのバージョニングが必要なことが多い | スキーマの進化によって対応できるため、バージョニング不要のことが多い |
GraphQLを使うことで、特にフロントエンド側で「必要なデータだけ取得したい」という柔軟なニーズに応えやすくなります。一方で、単純なデータ取得だけならRESTの方がシンプルな場合もあります。
GraphQL特徴
GraphQLの特徴は以下の通り。
- スキーマ言語とクエリ言語で構成されている
- スキーマ言語でAPI仕様を記述できる
- クエリとレスポンスの構造、各フィールドの型を定義できる
- 3種類のオペレーションタイプが定義できる
- query (データ取得)
- mutation (データ更新)
- subscription (データ購読)
- 3種類のオペレーションタイプが定義できる
- クエリとレスポンスの構造、各フィールドの型を定義できる
- クライアントはクエリ言語を使ってデータを取得・更新・購読できる
- クエリ言語では、スキーマ言語に定義されたフィールドを絞ることで、クライアントで必要な情報だけを取得できる
- 単一のエンドポイント(URL)のみを持つという特徴により、URL設計を考える必要がない
GraphQL用語
スキーマ
GraphQLスキーマは、どのようなデータ機能をクライアントアプリケーションに対して実行可能にするk
リゾルバー
クライアントから受け取ったGraphQLリクエストをデータソース操作用の命令に変換したり、データソースから
Query(取得)
Mutation(データ更新)
Subscription(データ購読)
オフラインでのデータアクセスに対応
Amplify DataStoreを使用することでオフラインであってもローカルデバイス上でデータのQuery(取得)やMutation(更新)が行える。
Mutation (更新) が行われた場合、オンラインになった際に AWS AppSync サービスに変更がアップロードされ、競合があった場合は解決される。
なぜチャットシステムにGraphQLがよく使われるのか
チャットシステムでは以下のような理由から、GraphQLが好まれることが多い。
- 柔軟なデータ取得
- チャットアプリでは、メッセージ、ユーザー情報、会話履歴など、必要なデータの粒度がクライアントによって異なることが多い。
- GraphQLでは**クライアントが「欲しいデータだけ」**をクエリで指定できるので、無駄なデータ転送を抑えられる。
- リアルタイム機能との親和性
- チャットアプリではメッセージの新着通知や既読情報など、リアルタイム通信が重要。
- GraphQLのSubscription機能を使うと、WebSocketを通じてリアルタイム更新をクライアントにプッシュ配信できる。
- 複雑なデータ構造の表現
- チャットは単純なテキストのやり取りだけでなく、スタンプ、ファイル送信、スレッド会話など複雑なデータ構造が関わる。
- GraphQLはリレーショナルなデータ構造をそのままクエリで表現できるので、柔軟なAPI設計が可能。
- フロントエンドとバックエンドの分離がしやすい
- クライアントが自由にデータを取得できるので、フロントエンドの開発速度を高めやすい。
- バックエンドは「必要なデータを返す仕組み(型やリゾルバ)」を用意するだけで済む。
これらの理由から、チャットシステムのようにリアルタイム性や柔軟なデータ取得が求められるアプリでは、GraphQLが選ばれることが多い。
GraphQLのSubscription機能とは?
GraphQLのSubscription機能は、クライアントがサーバーから「リアルタイムの更新情報」を受け取るための仕組みです。
通常のクエリ(Query)や更新(Mutation)は「リクエスト → レスポンス」で完結するのに対して、SubscriptionはWebSocketなどの仕組みを使い、サーバーがデータの更新をプッシュ配信できます。
例: チャットアプリでの利用
チャットシステムでは、新しいメッセージが投稿されたときにクライアントへ即座に通知を送る必要があります。
このとき、Subscriptionを使うと以下のように動作します。
- クライアントが「新しいメッセージを購読したい」とサーバーにSubscriptionを送信する。
- サーバー側はクライアントとのWebSocket接続を維持する。
- 誰かが新しいメッセージを送信すると、サーバーはSubscriptionに応じてリアルタイムにクライアントへデータを送信する。
このように、Subscriptionはチャットなどのリアルタイム通信が重要なアプリでよく利用される仕組みです。