Querier

GraphQL完全入門 | メリット・デメリット、REST APIとの比較、参考になるプロジェクトまで

2023.07.19に公開 | 2023.07.19に更新

Querier運営

@querier_io@querierinc

「Querier(クエリア)」は社内向け管理画面を圧倒的な速さで、かつビジネスのスケールに合わせて柔軟に構築することができるローコードツールです。

管理画面の構築もWeb上で完結
エンジニアのためのローコードツール

Querierについて詳しく見る

この記事では、近年注目を浴びているデータクエリ言語「GraphQL」について、その基本的な概念と使い方を解説します。

特にエンジニアにとっては、データ管理の観点から非常に重要な技術です。

既にGraphQLを用いて開発を行っている方や、これから学びたいと考えている初心者の方にも役立つ情報を提供できるように心掛けています。

GraphQLとは

GraphQLは、APIに対するクエリ言語であり、データを効率的に取得するためのランタイムとして機能します。

Facebook社によって2012年に開発され、その後2015年にオープンソースとして公開されました。名前の由来は、"Graph Query Language"からきています。

データモデルとしてのグラフ

GraphQLはその名前が示す通り、データをグラフとして表現します。これは、データがオブジェクトとその関係性(エッジ)から成るネットワーク(グラフ)としてモデル化されるという意味です。

これにより、リンクされたリソース間を自由に移動することができ、単一のリクエストで関連する多くのリソースを取得することが可能になります。

型システム

GraphQLは堅固な型システムを持っています。すべてのGraphQL APIは、スキーマと呼ばれる型システムを通じて定義されます。

これにより、APIを通じて取得できるものが具体的に何であるかを詳細に説明することができます。そして、これによりクライアントは正確に何を期待すべきか、またサーバーは何を保証すべきかを理解できます。

クエリ言語

GraphQLでは、クライアントが必要とするデータを正確に指定できるように設計されています。

これにより、データの過剰な取得(オーバーフェッチ)や不足(アンダーフェッチ)を防ぎます。クライアントはクエリで必要なデータを指定し、サーバーはそのクエリに従って正確なデータを返します。

データ操作とリアルタイムアップデート

GraphQLはデータの読み取りだけでなく、データの書き込み(ミューテーション)もサポートしています。また、リアルタイムのデータ更新をサブスクリプションという形で取得することができます。

これらの概念により、GraphQLは効率的なデータ取得、堅固な型安全性、リッチなデータ操作、リアルタイムアップデートなどを実現しています。これにより、開発者はデータ要件に集中することができ、サーバーとクライアント間の効率的なコミュニケーションを促進します。

GraphQLスキーマ

GraphQLスキーマは、GraphQL APIの重要な要素であり、使用するデータの形状と操作を定義します。スキーマは、どのような種類のオブジェクトがあるのか、それらのオブジェクト間でどのような関係があるのか、そしてそれらのオブジェクトにどのようなフィールドがあるのかを示します。

GraphQLスキーマは型システムによって定義されます。これには、スカラー型(String、Int、Float、Boolean、ID)のほかに、カスタムオブジェクト型や列挙型(Enum)、インターフェース型(Interface)、ユニオン型(Union)などがあります。

以下は、GraphQLスキーマの一部を表したサンプルです。

type User {
  id: ID!
  name: String!
  email: String!
  friends: [User!]!
}

type Query {
  user(id: ID!): User!
  users: [User!]!
}

このスキーマでは、Userという型を定義し、そのUser型はidnameemailというフィールドと、他のUser型のリストであるfriendsフィールドを持つことを指定しています。また、Queryという型では、ユーザーをIDで取得するクエリと、全ユーザーを取得するクエリを定義しています。

スキーマを定義することにより、GraphQL APIはクライアントに対して、どのような種類のクエリが可能であるか、どのような型のデータが返されるか、どのフィールドが必須であるかなどを具体的に伝えることができます。これにより、クライアントは具体的に何を期待すべきか、またサーバーは何を保証すべきかを理解できます。

さらに詳しいスキーマの解説や、どのようにスキーマを設計すべきかについては、こちらの記事をご覧ください。

GraphQLクエリの書き方

GraphQLでは、クエリによってサーバーから取得したいデータを具体的に指定します。そのため、GraphQLクエリの書き方を理解することは、GraphQLの基本的な使い方を学ぶ上で非常に重要です。

ベーシックなクエリ

GraphQLクエリの基本的な形式は以下のようになります:

query {
  user(id: 1) {
    name
    email
  }
}

このクエリは、id1のユーザーのnameemailをリクエストします。queryキーワードは、この操作がデータの読み取りであることを示しています。

フィールドの引数

上記のクエリでは、userフィールドにid: 1という引数を渡しています。GraphQLではフィールドに引数を渡すことができ、その引数はフィールドの返すデータを変更するために使用されます。

エイリアス

複数の同じフィールドをリクエストする場合や、フィールド名を変更したい場合には、エイリアスを使用します。

例えば以下のクエリは、id12の2人のユーザーの情報を取得します。

query {
  user1: user(id: 1) {
    name
    email
  }
  user2: user(id: 2) {
    name
    email
  }
}

フラグメント

フラグメントは、クエリ内で再利用可能な部分を定義するための機能です。

例えば、以下のクエリは、フラグメントを使用して2人のユーザーの情報を取得します。

query {
  user1: user(id: 1) {
    ...userInfo
  }
  user2: user(id: 2) {
    ...userInfo
  }
}

fragment userInfo on User {
  name
  email
}

GraphQLクエリは、これらの機能を組み合わせて、複雑なデータ要求を表現することが可能です。

GraphQLのメリット・デメリット、使い所

メリット

1. データの取得効率化
GraphQLの大きな特徴は、クライアントが必要なデータを指定できることです。
これにより、必要なデータだけを取得することができ、オーバーフェッチ(必要以上のデータを取得すること)やアンダーフェッチ(必要なデータが足りないこと)を防げます。

2. 型システムによる安全性
GraphQLスキーマによる堅固な型システムがあり、どのようなデータが返るかを明示的に定義できます。
これにより、APIがどのような操作を提供し、どのようなデータを返すかが自明になり、バグを未然に防ぐことができます。

3. リアルタイム更新
GraphQLはサブスクリプションという形でリアルタイムのデータ更新をクライアントに送信することができます。
これにより、リアルタイムの通知やチャットのような機能を容易に実装することができます。

デメリット

1. 学習コスト
GraphQLはRESTful APIとは異なる思考を必要とします。新しいクエリ言語、型システム、リゾルバーなど、学ぶべき新しい概念がいくつかあります。
また、既存のインフラにGraphQLを統合するには一定の工数が必要です

2. キャッシュの複雑さ
RESTful APIでは、URLをキーにしてキャッシュを行うことが一般的です。しかし、GraphQLは単一のエンドポイントで動作するため、クエリ単位でのキャッシュの管理が必要となります。
これにはクライアント側での対応や、専用のツールを使用する必要があります。

3. サーバー負荷の問題
クライアントが自由にデータを取得できる一方で、深いネストや大量のデータを一度に取得するクエリが投げられた場合、サーバーへの負荷が大きくなる可能性があります。
これに対処するためには、クエリの深度や複雑さに制限を設けるなどの対策が必要です。

使い所

以上のメリットとデメリットを考慮すると、GraphQLは以下のような場面で有効に活用できます。

  • フロントエンドとバックエンドの間でデータ要件が頻繁に変更する場合
  • フロントエンドから見て複数のリソースを一度に取得する必要がある場合
  • リアルタイムのデータ更新が必要な場合

一方、既存のシンプルなRESTful APIが十分に機能している場合や、学習コストや導入コストを抑えたい場合は、必ずしもGraphQLを導入する必要はありません。

自分のプロジェクトの要件に合わせて適切な技術を選択することが重要です。

GraphQL vs REST API

GraphQLとREST APIは、どちらもクライアントとサーバー間でデータを交換するための技術ですが、それぞれ異なる特徴と利点を持っています。

1. データ取得の効率性

REST API
REST APIでは、エンドポイントがリソースに直結しています。
一つのリソース(例えば、ユーザー情報)を取得するには一つのエンドポイントを呼び出し、別のリソース(例えば、そのユーザーの投稿一覧)を取得するには別のエンドポイントを呼び出す必要があります。

GraphQL
一方、GraphQLではクライアントが必要なデータを一つのクエリで具体的に指定できます。上記の例で言えば、ユーザー情報とそのユーザーの投稿一覧を一度のリクエストで取得することができます。
これにより、必要なデータだけを効率的に取得できます。

2. バージョニング

REST API
REST APIでは、APIの改訂や新機能の追加を行う際に新たなバージョンを定義することが一般的です。
これにより、古いバージョンのAPIを使用しているクライアントは影響を受けませんが、バージョン管理が複雑になることがあります。

GraphQL
GraphQLでは、スキーマがすべてのリクエストとレスポンスの形式を定義しています。新しいフィールドを追加するときはスキーマに追加すればよく、古いフィールドを削除するときは非推奨とマークして徐々に移行することが可能です。
これにより、APIのバージョニングが不要になります。

3. 型安全性

REST API
REST APIでは、通常、データ形式はドキュメンテーションやコード内でのみ明示されます。
そのため、データの構造が変更された場合、それがクライアントにすぐに伝わるとは限りません。

GraphQL
一方、GraphQLでは強力な型システムがあります。
これにより、クライアントは何を期待して、何を送るべきかを正確に知ることができます。また、型エラーは実行時ではなく、クエリの検証段階で検出されます。

以上の違いを考慮に入れて、プロジェクトの要件に合わせてGraphQLとREST APIのどちらを使用するかを選択することが重要です。

GraphQLの設計で参考になるプロジェクト

GraphQLを導入する際には、すでに実際にGraphQLを使用しているプロジェクトのスキーマを参考にすると良いでしょう。

以下に具体的なプロジェクトをいくつか紹介します。

1. GitHub

GitHubはパブリックなGraphQL APIを提供しています。そのスキーマはこちらで公開されています。
GitHubのスキーマは大規模なデータと多数のユーザーを扱うための設計がなされており、一貫性のある設計やエラーハンドリングの方法などを参考にできます。

2. Shopify

ShopifyもパブリックなGraphQL APIを提供しており、そのスキーマはこちらで公開されています。
Shopifyのスキーマは、商業的な取引を扱うための設計がなされています。特に、商品、顧客、注文などのビジネスドメインを表現するためのタイプ設計を参考にできます。

3. Yelp

YelpもまたパブリックなGraphQL APIを提供しています。そのスキーマはこちらで公開されています。
Yelpのスキーマは、レビューやビジネスリスティングなどの社会的なデータを扱うための設計がなされています。特に、ユーザーが生成するコンテンツを表現するためのタイプ設計を参考にできます。

さいごに

GraphQLは、その柔軟性と効率性からデータ駆動型の現代アプリケーション開発に大いに貢献しています。しかしながら、全てのプロジェクトがGraphQLを使用すべきというわけではありません。それが解決する課題と引き換えに新たな問題を生む可能性も理解しておくことが大切です。

最適な技術選択をするためには、その利点と欠点を十分に理解し、自分のプロジェクトの要件に合わせて考えることが必要です。

この記事がGraphQLの理解とその適用を考える一助となれば幸いです。

「Querier(クエリア)」は社内向け管理画面を圧倒的な速さで、かつビジネスのスケールに合わせて柔軟に構築することができるローコードツールです。

最新の記事

【告知】値の参照時の仕様変更のお知らせ

このたび2024年11月11日に値の参照に関する仕様変更を予定しておりますので詳細について報告いたします。

more

管理画面の構築もWeb上で完結
エンジニアのためのローコードツール

Querierについて詳しく見る