日本語
  • GraphQL
  • REST API
  • RESTful API

GraphQL と REST API

GraphQL と REST API の主な違い、利点、および最適な Web 開発のためにどちらを使用するかを探ります。

Darcy Ye
Darcy Ye
Developer
Simeng
Simeng
Developer

Web アプリ開発プロジェクトに取り組んだことがありますか?もしそうなら、「GraphQL」という用語に出会ったことがあるかもしれません。しかし、それは具体的に何を意味するのでしょうか?それはサーバーサイドとクライアントサイドのどちらの構成で使用されるのでしょうか?さらに、GraphQL の統合が他の代替案に比べて好ましいのはいつか?この記事では、これらの質問について案内します。

インターネット上のソフトウェアコンポーネント間でのデータ転送の通信チャネルとして、API は現代の Web サービスアーキテクチャにおいて不可欠な役割を果たし、酸素のような存在です。SOAP(Web サービスメッセージングプロトコル)、REST(アーキテクチャスタイル)、および GraphQL(クエリ言語とツール)などの API テクノロジーは、異なるサービス間の統合とデータ交換をサポートすることにより、ソフトウェア開発を便利で柔軟にします。

多くの種類の API があるにもかかわらず、近年の議論は主に 2 つの主要なパラダイムに集中しています: REST(表現状態転送)と GraphQL。どちらも幅広い利点を提供し、世界中の Web プロジェクトで使用されています。しかし、データ通信の管理方法において大きな違いがあります。

REST API とは?

REST は 21 世紀初頭に開発されたクロスネットワークハイパーメディアアプリケーションを構築するための構造化されたアーキテクチャスタイルで、クライアントとサーバー間でステートレスでキャッシュ可能な通信プロトコルを採用するように設計されています。REST API(RESTful API とも呼ばれます)は、REST アーキテクチャの推進力です。

REST API は、リソースをアドレス指定するためにユニフォームリソース識別子(URI)を使用します。REST API は、ネットワークリソースに対して CRUD(作成、読み取り、更新、削除)操作を実行するための異なるエンドポイントを使用して機能します。それは、プリセットされたデータ形式(メディアタイプまたは MIME タイプ)に頼ってクライアントに提供するリソースの形式とサイズを決定します。最も一般的な形式は JSON と XML(時には HTML またはプレーンテキスト)です。

クライアントがリソースをリクエストした後、サーバーはクエリを処理し、そのリソースに関連するすべてのデータを返します。レスポンスには、「200 OK」(成功した REST リクエストの場合)や「404 Not Found」(存在しないリソースの場合)などの HTTP レスポンスコードが含まれます。

REST API はどのように機能しますか?

REST API は、HTTP 上でリソースを公開するプリセットされたエンドポイントに依存します。各エンドポイントは、ユーザーや投稿などのリソースを表し、一意の URL で識別されます。REST の操作は、データの取得、作成、更新、削除に対応する標準的な HTTP メソッド(GET、POST、PUT、DELETE)に結び付けられています。

たとえば、GET /users へのリクエストは、ユーザーの完全なリストを取得し、GET /users/123 は、ID で特定された特定のユーザーの詳細を取得します。ユーザーの組織や組織役割などの関連データにもアクセスする必要がある場合は、追加の呼び出しを行い、GET /users/123/organizations を実行する必要があります。

REST はリソース中心のアプローチを採用しており、個別のリソースにアクセスし、それを操作することに焦点を当てています。

GraphQL とは?

GraphQL は、API の種類(またはクエリ言語)であり、それらのクエリに応答するためのランタイムエンジンです。簡素化された API を提供し、特にモバイルアプリケーションや特定のデータサブセットを必要とする複雑なアーキテクチャの実装に適しています。

GraphQL を使用すると、開発者は API から取得したいデータを指定できます。また、一度にすべてを取得するのではなく、必要なデータをオンデマンドで取得し、変更を即座に適用し、アプリケーションにサードパーティデータソースを統合することができます。

アプリケーションは、GraphQL クエリを使用して GraphQL サービスを呼び出すことができます。これらのクエリは、クライアントが要求したデータ要素を正確に返します。これにより、複数の API 呼び出し、ネットワーク帯域幅、および後処理が節約されます。これは、タブレットやモバイルフォンなど、消費者デバイスに近い場所にあるデータ中心の API に非常に効率的なソリューションです。

GraphQL はどのように機能しますか?

GraphQL は、それに対抗してクエリベースのアプローチを取ります。プリセットされたエンドポイントの代わりに、GraphQL は構造化クエリを受け入れる単一のエンドポイントを公開します。クライアントは、クエリ言語を使用して必要なデータを正確に指定します。

したがって、完全な GraphQL 実装には 2 つの部分が必要です: スキーマとリゾルバです。

GraphQL スキーマ

スキーマは、GraphQL クエリを通じて取得できるデータの種類とそのフィールドを定義します:

たとえば、次のようなスキーマがあるとします:

クライアントは、次のクエリを使用してユーザーの名前、メール、組織、役割を問い合わせることができます:

このクエリは、要求されたフィールド(メールと組織)のみを取得するだけでなく、関連データ(役割)を1つのリクエストで取得します。

GraphQL リゾルバ

GraphQL リゾルバは、クライアントからの GraphQL クエリで要求されたデータを取得または計算する方法を決定する、GraphQL サーバーの主要コンポーネントです。クライアントがクエリを送信すると、クエリ内の各フィールドがリゾルバに割り当てられ、そのフィールドのデータを取得または計算するためのロジックを含みます。

上記の例では、スキーマのリゾルバは次のようになります:

リゾルバには、ルートリゾルバとフィールドリゾルバの 2 種類があります。

  • ルートリゾルバ: スキーマ内のトップレベルフィールドを処理します。例えば、Query、Mutation、Subscription などです。
  • フィールドリゾルバ: タイプ内の個々のフィールドを処理し、通常はネストされたクエリ用です。特定のフィールドに対して具体的なリゾルバが提供されていない場合、GraphQL はデフォルトのリゾルバを使用し、親オブジェクトから一致するフィールド名の値を返します。

GraphQL 操作

GraphQL は、クエリ、ミューテーション、サブスクリプションの 3 種類の操作をサポートします。

  • Query: データを読み取るために使用されます。
  • Mutation: データを追加、変更、削除する操作を含め、書き込むために使用されます。
  • Subscription: データの永続的な接続を要求し、クライアントが関心のあるイベントの種類と返されるべきデータを宣言できます。

GraphQL と REST API の違い

GraphQL と REST API は異なる Web サービス間でデータを交換するためのツールですが、問題を解決するためのアプローチが異なるため、以下はそれらの主な違いです:

データ取得

REST API は、エンドポイントが固定の応答を返すため、データを過剰に取得または不足して取得することがよくあります。GraphQL はクライアントが必要なデータを直接リクエストできるようにすることでこの問題を解決し、不要なデータ転送を減少させます。これにより、モバイルや低帯域幅環境でのアプリケーションにとって理想的です。

上記の例では、ユーザーの静的データ、組織、およびユーザーに割り当てられた組織役割を取得する必要がある場合を考えてみましょう。REST API では、すべてのデータを入手するために異なるエンドポイントに対して複数のリクエストを行う必要があります。しかし、GraphQL を使用すれば、1 つのリクエストですべてのデータを取得できます。

柔軟性

REST のエンドポイントベースの構造は単純であり、標準的な CRUD 操作に利用できる単純なアプリケーションに効果的です。これは、REST API がリソース中心に設計されており、各エンドポイントが特定のリソースを表すためです。このアプローチの主な制限は、クライアントの要件の速やかな反復と変更を許可しないことです。クライアントに対して変更が行われるたびに、サーバーは新しいエンドポイントの追加や既存のエンドポイントの更新によって新しい要件に対応するために変更が必要です。これにより、多くの冗長なエンドポイントと複雑な API バージョン管理が生じることがよくあります。

一方で、GraphQL はより柔軟であり、クライアントが必要なデータのみをリクエストすることができます。クライアントの要件が頻繁に変更される場合、この柔軟性は特に有用であり、クライアントが新しいフィールドやネストされたデータをリクエストできるため、サーバー側の API 実装を変更する必要がなくなります。

キャッシング

GraphQL はデータ取得においてより効率的で柔軟ですが、一部の欠点もあります。主な問題の一つはキャッシングです。

REST API は成熟したエコシステムを持っています。そのステートレス性と標準化された性質により、サーバーレベルとクライアントレベルの両方でレスポンスをキャッシュするのが容易です。これにより、サーバーへのリクエスト数が大幅に削減され、パフォーマンスが向上します。

しかし、その柔軟性により、REST API に利用可能な多くのキャッシング技術は GraphQL には適用されません。特定のユースケースに基づいてクライアント側でキャッシングを処理する必要があり、クライアント開発に追加の負担がかかります。

プロとコン

名前プロコン
REST API- シンプルで広く普及しており、豊富なツールとコミュニティサポートがあります。
- 分かりやすい構造で、初心者でも理解しやすい。
- HTTP 標準を使用したキャッシングのためのビルトインサポートがあります。
- データの過剰取得または不足取得
- 変更がしばしば新しいバージョンの作成を必要とし、メンテナンスの負担を増大させます。
GraphQL- 正確なデータ取得により、パフォーマンスと効率が向上します。
- スキーマの進化により、バージョニングの必要性が減少します。
- インスペクションや型チェックなどの強力なツールで、開発経験が向上します。
- REST と比較してより複雑なセットアップと学習曲線があります。
- HTTP キャッシングに依存しないため、カスタムキャッシングソリューションが必要です。
- 単一のエンドポイントデザインはデバッグと監視を複雑にする可能性があります。

結論

近年、新参者として強い勢いを得ているにもかかわらず、アトミックデザインと厳密な性質から長い間、REST API は依然として重要な存在です。

REST と GraphQL は異なるニーズに対応し、異なるシナリオで優れています。REST のシンプルさは、単純なアプリケーションやマイクロサービスに最適な選択肢です。GraphQL は、特に多様なクライアントや複雑なデータの関係があるアプリケーションにおいて、柔軟で効率的なデータ取得を必要とする場合に際立ちます。それらの選択は、プロジェクトの具体的な要件、チームの専門知識、長期的な拡張性のニーズに依存します。