【GraphQL】GraphQLとは?

GraphQL

こんにちは、かつコーチです。

今回は、昨今流行っているGraphQLについて解説します。

これまでのSQLと何が違うのかも含めて解説します。

GraphQLは、Facebookが開発したAPIクエリ言語です。

REST APIの代替として広く採用されており、

クライアントがAPIから必要なデータを効率的に取得できるようにするために設計されています。

GraphQLの基本的な概念や特徴を理解するために、次のポイントについて解説します:

GraphQLとは何か?

GraphQLは、サーバーとクライアント間でデータのやり取りをするための

クエリ言語およびランタイムです。

APIのインターフェースを定義する方法として使われ、

クライアントがサーバーに**「何を、どのような形で欲しいか」を指定**できるのが最大の特徴です。

クエリ言語(Query Language)として、以下の3つの主要操作があります:

  • クエリ(Query): データを取得するためのリクエスト
  • ミューテーション(Mutation): データを変更するためのリクエスト(作成、更新、削除)
  • サブスクリプション(Subscription): リアルタイムデータを受け取るためのリクエスト(WebSocketを使用)

特徴

  • クライアントが欲しいデータを明示的に指定し、それに応じた結果が返ってくる。
  • 1回のリクエストで複数のリソース(エンティティ)を取得できる。
  • **オーバーフェッチ(不要なデータを取得する)アンダーフェッチ(必要なデータが取得できない)**を防ぐ。

GraphQLとSQLの違い

SQLは、主にデータベースに対して操作を行うための言語であり、

GraphQLはAPIに対してデータのやり取りを行うためのクエリ言語です。

用途も機能も異なります。

特徴SQL(Structured Query Language)GraphQL
対象リレーショナルデータベース(RDB)API(サーバー)
目的データベースからデータを操作・取得APIから必要なデータを取得
クエリ構造テーブルに対してSELECTINSERTUPDATEスキーマに基づくクエリ・ミューテーション
結果の形式SQLの結果はテーブル形式で返ってくるJSON形式で返ってくる
クエリの範囲データベーススキーマに依存APIのスキーマ(型定義)に依存
オーバーフェッチ固定されたクエリ結果が返るため、オーバーフェッチが起こりがちクライアントが欲しいデータだけを明示できるため、オーバーフェッチを防げる
複数リソースの取得複数テーブルを結合する必要がある(JOINなど)一つのクエリで複数のリソースを取得可能

GraphQLの主要な利点

GraphQLは、REST APIのいくつかの制約や課題を解決するために作られました。

特に、以下の点がGraphQLの大きな強みです。

クライアント主導のデータ取得

  • クライアントは、サーバーから何が欲しいのかを具体的に指定できます。必要なフィールドだけを取得することができるため、不要なデータの取得が防げます。
query {
  user(id: 1) {
    name
    email
    posts {
      title
    }
  }
}
  • 上記の例では、userエンティティに対して、ユーザー名、メールアドレス、およびそのユーザーの投稿のタイトルのみをリクエストしています。

オーバーフェッチとアンダーフェッチの解消

  • REST APIでは、特定のエンドポイントが大量のデータを返すため、必要以上にデータが送信されることがあり、これをオーバーフェッチと言います。また、複数のリソースを扱う際にアンダーフェッチ(必要なデータが全て取得できない)が起こることもあります。GraphQLでは、必要なデータだけを一度に取得できるため、この問題が解決されます。

1つのエンドポイントで複数リソースの取得が可能

  • REST APIでは、特定のリソースにアクセスするためにエンドポイントごとにリクエストが必要ですが、GraphQLでは1つのエンドポイントで複数のリソースにアクセスでき、効率的です。

柔軟な型システム

  • GraphQLのスキーマは厳密な型定義を持っており、APIの設計が明確です。サーバーが返すデータの型も保証されるため、開発中にエラーを減らすことができます。

リアルタイム対応

  • Subscriptionを利用することで、リアルタイムでデータの更新を取得できる機能が備わっています。これにより、WebSocketを使ってリアルタイムなデータ通信が可能です。

REST APIとの違い

REST APIは従来のAPI設計の一般的な方法で、

各リソースに対して独自のURL(エンドポイント)が必要です。

これに対して、GraphQLは一つのエンドポイントですべてのリソースにアクセスするという特徴があります。

比較表:GraphQL vs REST API

特徴REST APIGraphQL
エンドポイント数各リソースに対して異なるエンドポイント1つのエンドポイント
データの取得量オーバーフェッチ・アンダーフェッチが発生必要なデータのみ取得
リクエストの回数複数リソースに対して複数回のリクエスト1つのリクエストで複数リソース取得可能
リアルタイム性サーバーの対応に依存Subscriptionでリアルタイムに対応可能
型の保証明確な型の保証はない厳密な型システムで型エラーを防げる
キャッシングHTTPキャッシングが容易データ構造がクエリごとに変わるため難しい

GraphQLの使用例

クエリ(Query)

特定のユーザーの名前とその投稿を取得するクエリ例です。

query {
  user(id: 1) {
    id
    name
    posts {
      id
      title
    }
  }
}

ミューテーション(Mutation)

新しいユーザーを作成する場合のミューテーションの例です。

mutation {
  createUser(name: "John Doe", email: "john@example.com") {
    id
    name
    email
  }
}

サブスクリプション(Subscription)

リアルタイムで新しい投稿を監視するサブスクリプションの例です。

subscription {
  newPost {
    id
    title
    content
  }
}

GraphQLのデメリット

  1. 複雑な実装: クライアントが任意のクエリを指定できるため、サーバー側でクエリの効率化や最適化が必要です。特に、大規模なプロジェクトではN+1問題(クエリの過剰発生)に注意が必要です。
  2. キャッシングの難しさ: REST APIのように固定されたエンドポイントを持たないため、HTTPキャッシングがやや困難です。そのため、クライアント側でのキャッシングを工夫する必要があります。

まとめ

GraphQLは、APIから必要なデータを柔軟かつ効率的に取得するための強力なツールであり、

クライアント主導のデータ取得を実現します。

REST APIのオーバーフェッチやアンダーフェッチの問題を解決し、

リアルタイム通信にも対応していますが、

サーバー側の実装の複雑さやキャッシングの問題に注意が必要です。

SQLとは異なり、データベース操作ではなくAPIのデータ操作を担うものであり、

API設計において重要な選択肢の1つとなっています。

タイトルとURLをコピーしました