

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# REST と GraphQL の比較
<a name="comparing-rest-graphql"></a>

API (アプリケーションプログラミングインターフェイス) は、アプリケーション間のデータ交換を容易にする上で重要な役割を果たします。前述のように、API を設計するための GraphQL と REST という 2 つの顕著なアプローチが登場しています。どちらもクライアントとサーバーの通信を可能にする基本的な目的を果たしますが、実装とユースケースでは大きく異なります。

GraphQL と REST には、いくつかの重要な特徴があります。

1. **クライアント/サーバーモデル**: どちらもデータ交換にクライアント/サーバーアーキテクチャを使用します。

1. **ステートレス**: どちらもリクエスト間でクライアントセッション情報を維持しません。

1. **HTTP ベース**: どちらも通常、基本となる通信プロトコルとして HTTP を使用します。

1. **リソース指向設計**: どちらも、クライアントが API を介してアクセスおよび操作できるデータまたはオブジェクトを参照するリソースに関するデータ交換を設計します。

1. **データ形式の柔軟性**: 両方で最も一般的に使用されるデータ交換形式は JSON ですが、XML や HTML などの他の形式もサポートされています。

1. **言語とデータベースに依存しない**: どちらも任意のプログラミング言語またはデータベース構造で動作するため、高い相互運用性があります。

1. **キャッシュサポート**: どちらもキャッシュをサポートしているため、クライアントとサーバーは頻繁にアクセスされるデータを保存してパフォーマンスを向上させることができます。

GraphQL と REST は、いくつかの基本原則を共有しながら、API 設計とデータフェッチに対するアプローチが大きく異なります。

1. **リクエスト構造とデータ取得**

   REST は、さまざまな HTTP メソッド (GET、POST、PUT、DELETE) を使用して、リソースに対してオペレーションを実行します。これには、多くの場合、異なるリソースに複数のエンドポイントが必要になるため、データの取得が非効率になる可能性があります。例えば、GET オペレーションを実行してユーザーのデータを取得すると、データのオーバーフェッチまたはアンダーフェッチが発生する可能性があります。正しいデータを取得するには、切り捨てまたは複数のオペレーションを呼び出すことができます。

   GraphQL は、すべてのオペレーションに単一のエンドポイントを使用します。データの取得にはクエリに依存し、データの変更にはミューテーションに依存します。クライアントはクエリを使用して、1 回のリクエストで必要なデータを正確に取得できるため、データ転送を最小限に抑えることでネットワークオーバーヘッドを削減できます。

1. **サーバー側のスキーマ**

   REST にはサーバー側のスキーマは必要ありませんが、効率的な API 設計とドキュメント化のためにオプションで定義できます。

   GraphQL は、厳密に型指定されたサーバー側のスキーマを使用して、データとデータサービスを定義します。GraphQL Schema Definition Language (SDL) で記述されたスキーマには、各オブジェクトのオブジェクトタイプとフィールド、および各フィールドのオペレーションを定義するサーバー側のリゾルバー関数が含まれます。

1. **バージョニング**

   REST には URL にバージョニングが含まれていることがよくあり、複数の API バージョンを同時に維持できます。バージョニングは必須ではありませんが、変更の中断を防ぐのに役立ちます。

   GraphQL は、下位互換性を必要とすることで、明示的なバージョニングなしで API の継続的な進化を促進します。削除されたフィールドはエラーメッセージを返し、非推奨タグは古いフィールドを段階的に廃止し、警告メッセージを返します。

1. **エラー処理** 

   REST はタイプが弱いため、エラー処理を周囲のコードに組み込む必要があります。これにより、タイプ関連のエラー (例: 数値をテキストとして解析) が自動的に識別されない場合があります。

   対照的に、GraphQL は強く入力され、包括的なスキーマ定義が必要です。これにより、サービスが多くのリクエストエラーを高い詳細レベルで自動的に識別できるようになります。

1. **ユースケース**

   REST は次の用途に適しています。
   + データ要件がそれほど複雑ではない小規模なアプリケーション。
   + データおよびオペレーションがすべてのクライアントで同様に使用されるシナリオ。
   + 複雑なデータクエリのニーズがないアプリケーション。

   GraphQL は次の用途に適しています。
   + リクエストとレスポンスを最小限に抑えることが重要な、帯域幅が限られているシナリオ。
   + 単一のエンドポイントで組み合わせる必要がある複数のデータソースを持つアプリケーション。
   + クライアントリクエストが大きく異なり、異なるレスポンス構造を期待する場合。

   GraphQL API と REST API の両方を 1 つのアプリケーション内で、さまざまな機能分野に使用できることに注意してください。さらに、完全な書き換えなしで GraphQL 機能を含めるように RESTful API をアップグレードできます。例については[、 AWS 「データソースの GraphQL リゾルバーを構築する](https://aws.amazon.com/graphql/resolvers/)方法」を参照してください。