graphqlとは何か?基本的な概念や特徴、使い方についてを解説

昨今は、多くのWebアプリケーションが利用されています。

YoutubeやGmail・食べログなどもその中の1つです。

Webアプリケーションでは、サーバーから情報を取得・更新する際にAPIが使われることがあります。

APIを使うことで他システムとの情報連携ができる一方で、不要な情報を取得してしまったり、取得するデータ量が多過ぎてサーバーに負荷を与えてしまうなどといった副作用もありました。

この問題を解消する方法としてgraphqlというものがあります。

graphqlを使うことで情報のやりとりをスムーズにおこなうことが可能です。

今回は、graphqlの基本的な概念や使い方を紹介します。

graphqlとは

graphqlは「グラフキューエル」と呼び、Facebookが開発したWebAPIを作成するためのクエリ言語および実行エンジンです。

graphqlはクライアントから必要なデータだけを要求し、サーバーからは必要なデータのみを返すことができるというものです。

また、クライアント側で必要な情報をフィルタリングすることが容易になり、情報の更新もスムーズにおこなえます。

これにより不要なデータの取得を防ぎ、パフォーマンスの向上が可能です。

さらに、graphqlはリレーショナルデータベースのような複雑なデータモデルにも対応しているため、高度な機能を提供することもできます。

graphqlはWebアプリケーションやモバイルアプリケーションなど、多くのアプリケーションで広く浸透しています。

元々graphqlは、RESTfulといわれるAPIの代替手段として開発されたものです。

RESTful APIを使用することで、クライアントとサーバー間で情報をやりとりすることが容易になり、Webサービスの構築を効率よくできるようになりました。

一方、RESTful APIでは必要な情報を一度に取得できないことや、不要な情報が含まれてしまうなどといった課題がありました。 

このようなRESTful APIのデメリットに対し、graphqlは必要な情報だけを取得することができ、APIの呼び出し回数を減らすことができます。

また、不要な情報を取得することもないため、情報のやりとりが効率的になります。

graphqlはRESTful APIに比べて利用効率が良く、APIの開発やメンテナンス、パフォーマンスを向上させることが可能です。

graphqlの特徴

graphqlの1つ目の特徴は、先に述べたように必要な情報だけを取得できることです。

RESTful APIでは情報を取得する際、その情報に限定することができず、不要な情報が含まれてしまうことがありました。

例えば、ユーザーの情報が入っているテーブルから、氏名だけを出したいのにAPIの仕様上
・氏名
・住所
・電話番号
・メールアドレス
などが取得されてしまうなどです。

これらの情報を取得すると氏名だけを取得するのに比べて、非常に多くのデータが送られます。

通常はこれらを、APIで取得後に必要な形に開発者側が加工して利用します。

しかし、graphqlでは必要な情報だけを取得できるため、効率的な情報収集が可能になりました。

2つ目の特徴はクライアントが必要なデータを指定できることです。

RESTful APIでは、エンドポイントに対して設計された固定のレスポンスを返すことが一般的です。

しかし、graphqlではクライアントが必要なデータを指定することができるため、エンドポイントに対して柔軟なレスポンスを返すことができます。

例えば、社員の情報と役職の情報を取得する場合、API側で複数のテーブルの内容を合わせたテーブルを用意してくれていなければ、
1.社員情報を取得
2.役職情報を取得
3.プログラム内でこれらの情報をループしながら当てはめてから利用する

などのような作業が必要になります。

一方で自社のDBを利用している場合などには、複数のテーブルを結合すれば一回のクエリで必要なデータが取得可能です。

こういうった処理がAPIで可能になるのも、大きな特徴です。

3つ目の特徴はスキーマによる型の厳密な管理です。

RESTful APIでは、データのフォーマットや構造がAPIのエンドポイントに依存しているため、クライアントが不正なデータを送信する可能性があります。

しかし、graphqlではスキーマによってデータの型が厳密に管理されているため、不正なデータを送信することがなく、データの整合性が保たれます。

4つ目の特徴はひとつのエンドポイントで複数のリクエストを実行できることです。

RESTful APIでは、ひとつのエンドポイントに対してひとつのリクエストしか実行できないため、複数のリクエストを実行するためにはその分APIを呼び出さなければなりません。

一方、graphqlではひとつのエンドポイントで複数のリクエストを実行できるため、APIの呼び出し回数を減らすことができます。

これらの特徴により、graphqlはWebアプリケーションの開発において、柔軟かつ効率的なAPI設計を可能にする革新的な技術とされています。

graphqlの使い方

graphqlを使用するためには、
「graphqlサーバーの作成」
「スキーマの定義」
「クエリの送信」
「レスポンスの受け取り」

という手順を踏みます。

graphqlサーバーは、graphqlで定義されたスキーマをもとにクエリを受け取り、適切なデータを返す役割を持ちます。

graphqlサーバーを作成するためには、graphqlの実装ライブラリを使い、スキーマを定義しなければなりません。

スキーマは、graphqlでサポートするオブジェクトの型やフィールド、クエリ、ミューテーションなどを定義するために使用されます。

スキーマを定義した後はクエリの送信です。

クライアントからgraphqlサーバーにクエリを送信するためには、graphqlのクエリ言語を使ってクエリを記述します。

graphqlクエリ言語は、graphqlサーバーのスキーマに基づいて、クライアントが必要な情報を取得するために使用されます。

graphqlサーバーからのレスポンスは、クライアントが必要なデータを含むJSON形式です。

クライアントは受け取った情報から必要なデータを取り出して、UIに表示するなどの処理をおこないます。

graphqlでできること

graphqlを使用すると、WebAPIの開発において以下のようなことができます。

1つ目は柔軟なデータ取得です。

graphqlはAPIのクエリをフルカスタマイズして必要なデータのみを取得できます。

これにより過剰なデータの取得を避け、APIのレスポンスタイムを短縮することができます。

2つ目はリアルタイムデータのサポートです。

graphqlはリアルタイムのデータストリームをサポートします。

これにより、チャットアプリやストリーミングサービスなどの開発が容易になります。

3つ目は複雑なデータモデルのサポートです。

graphqlはリレーショナルデータベースやNoSQLデータベースなどの複雑なデータモデルにも対応しています。

これにより、複雑なデータモデルを持つアプリケーションの開発が容易になります。

4つ目は複数のデータソースの統合です。

graphqlは複数のデータソースを統合できます。

これにより、複数のAPIからデータを取得してひとつのAPIとして公開が可能です。

5つ目はキャッシングとパフォーマンスの最適化です。

graphqlはリクエストとレスポンスのキャッシングをサポートしてくれます。

これにより同じリクエストが複数回送信された場合でも、APIのレスポンスタイムを短縮することができます。

graphqlのメリットとデメリット

graphqlは便利なクエリ言語である一方、取り扱うにおいてはデメリットもあります。

ここではgraphqlのメリットとデメリットをそれぞれ解説します。

graphqlのメリット

メリットの1つ目はフレキシブルなデータ取得ができることです。

graphqlはクライアントが必要なデータだけをリクエストできるため、余計なデータ取得や不要なリクエストが起こりにくくなります。

これによりネットワークのトラフィックを削減し、パフォーマンス向上につながります。

2つ目は多様なデータソースの統合です。

graphqlはデータベース、キャッシュなど、異なるデータソースを統合できます。

複雑なアプリケーションであっても、シームレスなデータアクセスの実現が可能です。

3つ目はバージョニングが不要なことです。

graphqlはフィールドレベルでバージョニングができます。

つまり、APIのバージョンを変更する必要がなく、APIの変更が既存のアプリケーションに与える影響を最小限に抑えることができます。

graphqlのデメリット

デメリットの1つ目は学習コストの高さです。

graphqlはRESTful APIとは異なる概念や設計思想を持っているため、学習に時間を要します。

特に、graphqlのスキーマ定義などは独自の文法を持っているため、初心者にはハードルが高いです。

2つ目はネットワーク負荷の増加です。

graphqlではクライアントが必要な情報だけを取得できるため、ひとつのクエリで複数の情報を取得できることを解説しました。

これはネットワーク負荷が少なくなるというメリットがある反面、クエリが複雑になることで逆に負荷が増加する可能性があることを考慮する必要があります。

3つ目は既存のシステムとの互換性です。

graphqlは独自の設計思想を持っているため、既存のシステムとの互換性に課題があります。

既存のシステムとの連携においては、APIの変更や既存のコードの修正などが必要です。

また、graphqlの採用によって既存の技術とのマッチングが難しくなる可能性もあります。

graphqlは流行らない?graphqlの今後

graphqlは比較的新しい技術です。

そのため、まだまだ改善の余地がある一方、近代的な設計思想になっていることから市場の注目度は高いです。

例えば、graphqlはクライアントサイドでの使用に適しているため、フロントエンドフレームワークとの相性が良いとされています。

これらのフレームワークがますます普及する中で、graphqlの需要も高まっていくと考えられます。

また、graphqlはマイクロサービスとの組み合わせに適したAPI技術としても注目されています。

そのため、サーバーレスアーキテクチャとの相性が良いとも言われており、コスト面や拡張性の観点からも今後の活躍の幅は広がると推察されます。

今後新しいサービスや機能が実装される可能性もあることから、graphqlは今後流行していくことが予想されます。

Webアプリケーション開発ならAMELAに

今回はgraphqlについてみてきました。

新しい技術や言語が多数出てくる現在では、
「単に良さそうだから使う」
というのは、長期的に見た時に大きなリスクが生じます。

例えば、今回のgraphqlも、まだまだ新しい技術であり、今後の仕様変更や問題点が出てきた場合に、作り直しが必要になれば、大きな費用がかかります。

そのため、長期的にみて安全な言語や技術を選ぶ必要があります。

AMELAでは、海外のエンジニアを多数抱えており、他社に比べてレベルの高いシステム開発が安価で出来ます。

是非一度ご連絡いただければと思います。