【告知】値の参照時の仕様変更のお知らせ
このたび2024年11月11日に値の参照に関する仕様変更を予定しておりますので詳細について報告いたします。
more
2023.07.19に公開 | 2023.07.19に更新
Querier運営
「Querier(クエリア)」は社内向け管理画面を圧倒的な速さで、かつビジネスのスケールに合わせて柔軟に構築することができるローコードツールです。
管理画面の構築もWeb上で完結
エンジニアのためのローコードツール
この記事では、近年注目を浴びているデータクエリ言語「GraphQL」について、その基本的な概念と使い方を解説します。
特にエンジニアにとっては、データ管理の観点から非常に重要な技術です。
既にGraphQLを用いて開発を行っている方や、これから学びたいと考えている初心者の方にも役立つ情報を提供できるように心掛けています。
GraphQLは、APIに対するクエリ言語であり、データを効率的に取得するためのランタイムとして機能します。
Facebook社によって2012年に開発され、その後2015年にオープンソースとして公開されました。名前の由来は、"Graph Query Language"からきています。
GraphQLはその名前が示す通り、データをグラフとして表現します。これは、データがオブジェクトとその関係性(エッジ)から成るネットワーク(グラフ)としてモデル化されるという意味です。
これにより、リンクされたリソース間を自由に移動することができ、単一のリクエストで関連する多くのリソースを取得することが可能になります。
GraphQLは堅固な型システムを持っています。すべてのGraphQL APIは、スキーマと呼ばれる型システムを通じて定義されます。
これにより、APIを通じて取得できるものが具体的に何であるかを詳細に説明することができます。そして、これによりクライアントは正確に何を期待すべきか、またサーバーは何を保証すべきかを理解できます。
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
型はid
、name
、email
というフィールドと、他のUser
型のリストであるfriends
フィールドを持つことを指定しています。また、Query
という型では、ユーザーをIDで取得するクエリと、全ユーザーを取得するクエリを定義しています。
スキーマを定義することにより、GraphQL APIはクライアントに対して、どのような種類のクエリが可能であるか、どのような型のデータが返されるか、どのフィールドが必須であるかなどを具体的に伝えることができます。これにより、クライアントは具体的に何を期待すべきか、またサーバーは何を保証すべきかを理解できます。
さらに詳しいスキーマの解説や、どのようにスキーマを設計すべきかについては、こちらの記事をご覧ください。
GraphQLでは、クエリによってサーバーから取得したいデータを具体的に指定します。そのため、GraphQLクエリの書き方を理解することは、GraphQLの基本的な使い方を学ぶ上で非常に重要です。
GraphQLクエリの基本的な形式は以下のようになります:
query {
user(id: 1) {
name
email
}
}
このクエリは、id
が1
のユーザーのname
とemail
をリクエストします。query
キーワードは、この操作がデータの読み取りであることを示しています。
上記のクエリでは、user
フィールドにid: 1
という引数を渡しています。GraphQLではフィールドに引数を渡すことができ、その引数はフィールドの返すデータを変更するために使用されます。
複数の同じフィールドをリクエストする場合や、フィールド名を変更したい場合には、エイリアスを使用します。
例えば以下のクエリは、id
が1
と2
の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クエリは、これらの機能を組み合わせて、複雑なデータ要求を表現することが可能です。
1. データの取得効率化
GraphQLの大きな特徴は、クライアントが必要なデータを指定できることです。
これにより、必要なデータだけを取得することができ、オーバーフェッチ(必要以上のデータを取得すること)やアンダーフェッチ(必要なデータが足りないこと)を防げます。
2. 型システムによる安全性
GraphQLスキーマによる堅固な型システムがあり、どのようなデータが返るかを明示的に定義できます。
これにより、APIがどのような操作を提供し、どのようなデータを返すかが自明になり、バグを未然に防ぐことができます。
3. リアルタイム更新
GraphQLはサブスクリプションという形でリアルタイムのデータ更新をクライアントに送信することができます。
これにより、リアルタイムの通知やチャットのような機能を容易に実装することができます。
1. 学習コスト
GraphQLはRESTful APIとは異なる思考を必要とします。新しいクエリ言語、型システム、リゾルバーなど、学ぶべき新しい概念がいくつかあります。
また、既存のインフラにGraphQLを統合するには一定の工数が必要です
2. キャッシュの複雑さ
RESTful APIでは、URLをキーにしてキャッシュを行うことが一般的です。しかし、GraphQLは単一のエンドポイントで動作するため、クエリ単位でのキャッシュの管理が必要となります。
これにはクライアント側での対応や、専用のツールを使用する必要があります。
3. サーバー負荷の問題
クライアントが自由にデータを取得できる一方で、深いネストや大量のデータを一度に取得するクエリが投げられた場合、サーバーへの負荷が大きくなる可能性があります。
これに対処するためには、クエリの深度や複雑さに制限を設けるなどの対策が必要です。
以上のメリットとデメリットを考慮すると、GraphQLは以下のような場面で有効に活用できます。
一方、既存のシンプルなRESTful APIが十分に機能している場合や、学習コストや導入コストを抑えたい場合は、必ずしもGraphQLを導入する必要はありません。
自分のプロジェクトの要件に合わせて適切な技術を選択することが重要です。
GraphQLとREST APIは、どちらもクライアントとサーバー間でデータを交換するための技術ですが、それぞれ異なる特徴と利点を持っています。
REST API
REST APIでは、エンドポイントがリソースに直結しています。
一つのリソース(例えば、ユーザー情報)を取得するには一つのエンドポイントを呼び出し、別のリソース(例えば、そのユーザーの投稿一覧)を取得するには別のエンドポイントを呼び出す必要があります。
GraphQL
一方、GraphQLではクライアントが必要なデータを一つのクエリで具体的に指定できます。上記の例で言えば、ユーザー情報とそのユーザーの投稿一覧を一度のリクエストで取得することができます。
これにより、必要なデータだけを効率的に取得できます。
REST API
REST APIでは、APIの改訂や新機能の追加を行う際に新たなバージョンを定義することが一般的です。
これにより、古いバージョンのAPIを使用しているクライアントは影響を受けませんが、バージョン管理が複雑になることがあります。
GraphQL
GraphQLでは、スキーマがすべてのリクエストとレスポンスの形式を定義しています。新しいフィールドを追加するときはスキーマに追加すればよく、古いフィールドを削除するときは非推奨とマークして徐々に移行することが可能です。
これにより、APIのバージョニングが不要になります。
REST API
REST APIでは、通常、データ形式はドキュメンテーションやコード内でのみ明示されます。
そのため、データの構造が変更された場合、それがクライアントにすぐに伝わるとは限りません。
GraphQL
一方、GraphQLでは強力な型システムがあります。
これにより、クライアントは何を期待して、何を送るべきかを正確に知ることができます。また、型エラーは実行時ではなく、クエリの検証段階で検出されます。
以上の違いを考慮に入れて、プロジェクトの要件に合わせてGraphQLとREST APIのどちらを使用するかを選択することが重要です。
GraphQLを導入する際には、すでに実際にGraphQLを使用しているプロジェクトのスキーマを参考にすると良いでしょう。
以下に具体的なプロジェクトをいくつか紹介します。
GitHubはパブリックなGraphQL APIを提供しています。そのスキーマはこちらで公開されています。
GitHubのスキーマは大規模なデータと多数のユーザーを扱うための設計がなされており、一貫性のある設計やエラーハンドリングの方法などを参考にできます。
ShopifyもパブリックなGraphQL APIを提供しており、そのスキーマはこちらで公開されています。
Shopifyのスキーマは、商業的な取引を扱うための設計がなされています。特に、商品、顧客、注文などのビジネスドメインを表現するためのタイプ設計を参考にできます。
YelpもまたパブリックなGraphQL APIを提供しています。そのスキーマはこちらで公開されています。
Yelpのスキーマは、レビューやビジネスリスティングなどの社会的なデータを扱うための設計がなされています。特に、ユーザーが生成するコンテンツを表現するためのタイプ設計を参考にできます。
GraphQLは、その柔軟性と効率性からデータ駆動型の現代アプリケーション開発に大いに貢献しています。しかしながら、全てのプロジェクトがGraphQLを使用すべきというわけではありません。それが解決する課題と引き換えに新たな問題を生む可能性も理解しておくことが大切です。
最適な技術選択をするためには、その利点と欠点を十分に理解し、自分のプロジェクトの要件に合わせて考えることが必要です。
この記事がGraphQLの理解とその適用を考える一助となれば幸いです。
Querier運営
「Querier(クエリア)」は社内向け管理画面を圧倒的な速さで、かつビジネスのスケールに合わせて柔軟に構築することができるローコードツールです。
このたび2024年11月11日に値の参照に関する仕様変更を予定しておりますので詳細について報告いたします。
more
データフローの通知設定機能・監査ログへのパラメータが追加されましたのでご紹介します。
more
データフローのアクションに永続化などに利用できるローカルストレージ機能を追加しました。
more
日本を健康に。多彩なフィットネスブランドを展開中。スタジオ付きの「JOYFIT」、24時間型の「JOYFIT24」、ヨガスタジオ「JOYFIT YOGA」、パーソナルジム「JOYFIT+」、家族向けの「FIT365」など、多彩なブランド展開で全国を席巻しているスポーツ事業。
more
管理画面の構築もWeb上で完結
エンジニアのためのローコードツール