Uenishi.Web

大阪に生息しているプログラマーのブログ

GraphQLの基礎まとめ

完全な個人用メモです。

GraphQLの「Graph」とは

グラフ理論のこと

ノード(頂点)の集合とエッジ(辺)の集合で構成されるグラフに関する学問。

GraphQLとは?

API用のクエリ言語。

TypeSystemを使用してクエリを実行するためのサーバー側のランタイム(実装)。

クエリ(QL)とは

「質問」や「問い合わせ」を意味する。

DBMSに対してデータの検索などの処理を行うように求める命令文のことを指す。

GraphQL スキーマとは
GraphQL APIサーバーがどんなクエリを受け付けてくれるかを示すもの。 GraphQL Schema Langage(DSL)で記述する。 スキーマは型情報だけを定義したものであり、サーバーの実装ロジックは考慮しない。

GraphQL APIの仕様を表現するもの。 GraphQL APIを構築するにあたり、FW、言語に依存せずにSDLで表現できます。

そもそも「スキーマ」とは

スキーマとは、図式、図解、概要、あらまし、などの意味を持つ英単語。物事や計画の概略や仕組み、構造、形式などを示したものを意味することが多い。

データベースに「どのような種類のデータをどのような構造で格納するかを定義したもの」をスキーマという。

スキーマ言語

SGMLXMLなどの汎用的なマークアップ言語で、使用するタグ の宣言や属性の書式などを記述し、ある特定の用途やデータ構造のための具体的なマークアップ言語を定義するための言語(メタ言語)をスキーマ言語という。

ざっくりいうと「何かの構造」についてす表すときに扱われる、抽象的な概念。

データベースをはじめ、いろんな技術にスキーマの概念は存在するが、それぞれ意味合いは全く異なっている。

GraphQLでのスキーマとは、クライアントがアクセスを行うAPIの仕様を表現するもの。

フロントエンドとバックエンド間の通信を定義したインターフェース

RESTのように、APIのデータをエンドポイントの集合で捉えるのではなく、「型の集合」として捉える。

この「型の集合」をスキーマと呼ぶ。

チームで開発する際は、フロントエンドとバックエンドの両方にスキーマによる型定義の情報を把握しておく必要があります。スキーマを定義することで、クライアントサイドとサーバーサイドの両方で、GraphQLのリクエストを型チェック(バリデーション)を行うため、例えば、バックエンドで定義した型と異なるクエリをフロントエンドで実行した場合、正常にデータを取得できずエラーが返ってきます。

リゾルバ(resolver)とは
Resolversは GraphQL の operation(query や mutation や subscription)が、実際にどのような処理を行なってデータを返すのかという指示書です。Resolverは schema で定義した型の値を返さなければいけません。もしくはその型の値の promise を返さなければいけません。

スキーマはあくまで定義のみで、実際のデータ操作は行わない。

実際のデータ操作を行い、返すデータを実装するのがリゾルバー。

リゾルバーの実態は特定のフィールドのデータを返す関数(メソッド)。サーバーサイドの開発者側が提供する必要がある。

REST APIとの違い
REST API

データを取得する際に、複数のエンドポイント (http://○○○○/users, http://○○○○/posts などのようなURI) を利用する。

必要なデータがあれば各エンドポイントに問い合わせ、データを取得しクライアント側で使用する。

  • アンダーフェッチ
    • オーバーフェッチ

      GraphQL

      「1つのエンドポイントのみ」を持ち、クエリーを設定(問い合わせ、更新、どのデータが欲しいかの指定)することでサーバーからデータを取得することができる。

      画像が読み込まれない場合はページを更新してみてください。

      引用

      GraphQLでのクエリ言語
      Query

      データ取得用

      RESTでのGET、SQLでのSelectにあたる

      Mutation

      データ更新用

      RESTではPOST, PATCH, DELETE

      SQLではCreate, Update, Delete

      に該当する

      Mutationは「突然変異」という意味。

      おそらくGraphQLでのみ使用されている言葉。

      Subscription

      イベント監視用

      ChatアプリなどのようなリアルタイムのRead Operationに利用する。

      これらの3つを「オペレーション型」と呼んでいる。