メインコンテンツまでスキップ

GraphQL

Overview

GraphQLはAPI用のクエリ言語であり、データに定義した型システムを使用してクエリを実行するためのサーバーサイドランタイム。
GraphQL仕様は2015年にオープンソース化され以来、様々なプログラミング言語に実装されている。
GraphQLは特定のデータベースやストレージエンジンに縛られることなく、既存のコードとデータに基づいて動作する。

ヒント

GraphQLはただのクエリの構文(言語)ではなく、サーバーでクエリを受け取ってデータを返すまでの動作を担う「実行環境」そのものも含んでいる。
つまり「GraphQLはAPI用のクエリ言語であり、**それを実行するサーバー側の仕組み(ランタイム)**も一緒に提供される」という意味。

GraphQL 動作するランタイム

GraphQLは様々なプログラミング言語で実装されており、以下のようなサーバーサイドランタイムが存在する。

GraphQLとREST APIの違い

GraphQLとREST APIはどちらもAPIを提供する手段だが、いくつかの重要な違いがある。

項目REST APIGraphQL
エンドポイントリソースごとに複数のエンドポイントを用意する必要がある単一のエンドポイント(/graphqlなど)を通してリクエストする
データ取得量過剰取得(Over-fetching)や不足取得(Under-fetching)が起こりやすい必要なデータだけをクエリで指定できる
型システムAPIレスポンスはドキュメント化されていないことが多いスキーマ(型)を明示的に定義し、クライアントが知ることができる
柔軟性固定的なレスポンスフォーマットクライアントが欲しいデータの構造を指定できる
バージョニングエンドポイントのバージョニングが必要なことが多いスキーマの進化によって対応できるため、バージョニング不要のことが多い

GraphQLを使うことで、特にフロントエンド側で「必要なデータだけ取得したい」という柔軟なニーズに応えやすくなります。一方で、単純なデータ取得だけならRESTの方がシンプルな場合もあります。

GraphQL特徴

GraphQLの特徴は以下の通り。

  • スキーマ言語とクエリ言語で構成されている
  • スキーマ言語でAPI仕様を記述できる
    • クエリとレスポンスの構造、各フィールドの型を定義できる
      • 3種類のオペレーションタイプが定義できる
        • query (データ取得)
        • mutation (データ更新)
        • subscription (データ購読)
  • クライアントはクエリ言語を使ってデータを取得・更新・購読できる
  • クエリ言語では、スキーマ言語に定義されたフィールドを絞ることで、クライアントで必要な情報だけを取得できる
  • 単一のエンドポイント(URL)のみを持つという特徴により、URL設計を考える必要がない

GraphQL用語

スキーマ

GraphQLスキーマは、どのようなデータ機能をクライアントアプリケーションに対して実行可能にするk

リゾルバー

クライアントから受け取ったGraphQLリクエストをデータソース操作用の命令に変換したり、データソースから

Query(取得)

Mutation(データ更新)

Subscription(データ購読)

オフラインでのデータアクセスに対応

Amplify DataStoreを使用することでオフラインであってもローカルデバイス上でデータのQuery(取得)やMutation(更新)が行える。
Mutation (更新) が行われた場合、オンラインになった際に AWS AppSync サービスに変更がアップロードされ、競合があった場合は解決される。

なぜチャットシステムにGraphQLがよく使われるのか

チャットシステムでは以下のような理由から、GraphQLが好まれることが多い。

  1. 柔軟なデータ取得
    • チャットアプリでは、メッセージ、ユーザー情報、会話履歴など、必要なデータの粒度がクライアントによって異なることが多い。
    • GraphQLでは**クライアントが「欲しいデータだけ」**をクエリで指定できるので、無駄なデータ転送を抑えられる。
  2. リアルタイム機能との親和性
    • チャットアプリではメッセージの新着通知や既読情報など、リアルタイム通信が重要。
    • GraphQLのSubscription機能を使うと、WebSocketを通じてリアルタイム更新をクライアントにプッシュ配信できる。
  3. 複雑なデータ構造の表現
    • チャットは単純なテキストのやり取りだけでなく、スタンプ、ファイル送信、スレッド会話など複雑なデータ構造が関わる。
    • GraphQLはリレーショナルなデータ構造をそのままクエリで表現できるので、柔軟なAPI設計が可能。
  4. フロントエンドとバックエンドの分離がしやすい
    • クライアントが自由にデータを取得できるので、フロントエンドの開発速度を高めやすい。
    • バックエンドは「必要なデータを返す仕組み(型やリゾルバ)」を用意するだけで済む。

これらの理由から、チャットシステムのようにリアルタイム性や柔軟なデータ取得が求められるアプリでは、GraphQLが選ばれることが多い。

GraphQLのSubscription機能とは?

GraphQLのSubscription機能は、クライアントがサーバーから「リアルタイムの更新情報」を受け取るための仕組みです。
通常のクエリ(Query)や更新(Mutation)は「リクエスト → レスポンス」で完結するのに対して、SubscriptionはWebSocketなどの仕組みを使い、サーバーがデータの更新をプッシュ配信できます。

例: チャットアプリでの利用

チャットシステムでは、新しいメッセージが投稿されたときにクライアントへ即座に通知を送る必要があります。
このとき、Subscriptionを使うと以下のように動作します。

  1. クライアントが「新しいメッセージを購読したい」とサーバーにSubscriptionを送信する。
  2. サーバー側はクライアントとのWebSocket接続を維持する。
  3. 誰かが新しいメッセージを送信すると、サーバーはSubscriptionに応じてリアルタイムにクライアントへデータを送信する。

このように、Subscriptionはチャットなどのリアルタイム通信が重要なアプリでよく利用される仕組みです。

Resource