GraphQLとは?RESTとの違いを注文方式で解説

システム開発・テクノロジー
GraphQLとは?ざっくりと3行で
  • GraphQLとは、クライアントが欲しいデータの形を自分で指定し、1回のリクエストでまとめて取得できるAPI向けのクエリ言語のことだ。
  • 必要な項目だけを狙って取れるから、REST APIにありがちな取りすぎ・取り足りないの無駄が減る。あちこちの窓口を行き来していた通信が一本にまとまるのが強みだ。
  • 導入すると、画面ごとにサーバー担当へ改修を頼んでいた作業が減り、フロント側が欲しいデータを自分で組み立てられるようになる。
GraphQLを、必要な料理だけを一枚の注文書でまとめて頼めるフードコートに例え、RESTとの違いを描いた4コマ漫画。
①複数の店を回り一品ずつ頼む会社員が疲れ果てる。②注文書に書けば一度で届く単一窓口を発見する。③欲しい品だけを一皿でぴったり受け取り感動する。④デプロイ太郎が欲張った注文は厨房を圧迫すると助言する。

この4コマは、複数のREST APIをつなぎ合わせて画面を作っていた開発現場で実際に起こりがちな非効率を、フードコートの注文に置き換えたケーススタディです。コマ①で会社員が店を渡り歩く姿は、1つの画面を表示するために何度もサーバーへ問い合わせる状態を表しています。通信の往復が増えるほど表示は遅くなり、ユーザー体験にも直結します。

コマ②とコマ③の一枚の注文書こそGraphQLの中核で、クライアントが欲しいフィールドだけを書いて送ると、その形どおりのデータが1回で返ってきます。ここで効くのがスキーマという型の取り決めであり、何を頼めるかが事前に定義されているため、注文ミスや余分な受け取りを未然に防げるわけです。

とはいえコマ④の警告は実務で軽視できません。自由に指定できる裏返しで、深くネストした欲張りな問い合わせはサーバーへ想定外の負荷をかけます。クエリの深さ制限やコスト解析をあらかじめ設計へ組み込むことが、GraphQLを安全に運用する分かれ道になるでしょう。

なぜGraphQLは1回のリクエストで済むのか?

GraphQLは名前にQLと付きますが、SQLの一種ではなく、Web APIの窓口でクライアントが欲しいデータの形を指定するための言語です。

GraphQLの最大の特徴は、1つの窓口へ欲しいデータの形を書いて送るだけで、必要な情報がまとめて返ってくる点にあります。REST APIの場合、ユーザー情報はこのURL、その人の投稿一覧は別のURL、というように用途ごとに入り口が分かれているのが一般的です。1画面を組み立てるのに何度も通信が発生し、しかも返ってくるデータには使わない項目まで含まれがちでした。

一方のGraphQLは、入り口を1つに束ねます。クライアントが欲しい項目を並べて指定すると、サーバーはその形どおりに応答します。使わないデータを大量に受け取るオーバーフェッチも、足りずに再取得するアンダーフェッチも起きにくいのが利点です。この仕組みは2012年にFacebook(現Meta)が社内開発を始め、2015年に仕様と参照実装をオープンソースとして公開したことで広く知られるようになりました。

自由に項目を指定できる反面、深くネストした重いクエリはサーバー負荷を跳ね上げるため、クエリの深さ制限やコスト計算をあらかじめ組み込むのが実務の定石です。

GraphQLを支えるのがスキーマと呼ばれる型の定義です。どんなデータをどんな形で取得できるかを事前に決めておくため、フロントとバックの担当者が同じ設計図を共有できます。2018年にはGraphQLの管理がLinux Foundation傘下のGraphQL Foundationへ移され、特定企業に依存しない中立的な標準として運用が続いています。強い型付けによって、通信の途中で項目名の食い違いに気づける点も、大規模開発で重宝される理由と言えるでしょう。

GraphQLのよくある誤解

RESTを完全に置き換える技術だと思い込む

GraphQLはRESTの上位互換ではなく、向き不向きのある選択肢の1つです。画面ごとに必要なデータが大きく変わるアプリや、モバイルのように通信を減らしたい場面では強みを発揮します。逆に、ファイルのアップロードや単純な一覧取得だけならRESTの方がシンプルに済むことも多く、両者を併用する現場も珍しくありません。

名前からデータベースの一種だと誤解する

GraphのQLという響きから、グラフ型データベースやSQLの仲間だと考える人がいますが、これは別物です。GraphQLはあくまでAPIの前に立つ受付役で、実際のデータがMySQLに入っていてもNoSQLに入っていても関係なく動きます。どこからデータを集めてくるかはサーバー側の実装しだいで、GraphQL自体がデータを保管するわけではありません。

単一エンドポイントだから必ず速いと考える

入り口が1つにまとまると聞くと、常に高速だと期待してしまいがちではないでしょうか。実際には、無計画に深いクエリを許すと1回の問い合わせで大量の処理が走り、かえって重くなることがあります。速さは設計と運用の工夫があって初めて得られるものだと理解しておくと安心です。

会話での使われ方

GraphQLを提案するベンダー担当者を表すITKAGYO運営者のアイコン画像

今回のアプリは画面ごとに欲しい項目がバラバラなので、GraphQLで組むご提案です。通信回数を抑えられるぶん、スマホでの表示体感がかなり軽くなります。既存のREST部分は残したまま、段階的に寄せていく形でも問題ありません。

システム開発の商談で、ベンダーの担当者がクライアントの情報システム部門へ設計方針を提案している場面です。メリットと移行の現実性をセットで伝えています。

Slackで新人にGraphQLを教える先輩エンジニアを表すITKAGYO運営者のアイコン画像

そのデータ、GraphQLのエンドポイント1個に欲しいフィールド書いて投げれば一発で取れるよ。

社内のSlackで、新人がAPIの呼び出し方に迷っているのを見た先輩エンジニアが、短く要点だけを答えた場面です。

勉強会でGraphQLの負荷を雑談する参加者を表すITKAGYO運営者のアイコン画像

GraphQL便利だよねって話で盛り上がったんだけど、うちのチームは深いクエリでサーバーが悲鳴あげて、結局コスト制限入れたらしいよ。

社外の勉強会後の雑談で、参加者同士が自社の運用体験をゆるく共有している場面です。良い面だけでなく苦労話も出ています。

GraphQLの歴史

GraphQLがどんな課題から生まれ、どう標準化されてきたかを振り返ると、なぜ単一エンドポイントという発想に至ったのかが見えてきます。

出来事
2012Facebook(現Meta)が、モバイルアプリの通信効率を改善するためGraphQLを社内開発。
2015仕様のドラフトと参照実装をオープンソースとして公開し、広く知られるようになる。
2018管理がLinux Foundation傘下のGraphQL Foundationへ移管され、中立的な標準として運用開始。
現在Web・モバイル・マイクロサービス連携など幅広い場面で、RESTと並ぶAPI設計の選択肢として定着。

GraphQLとREST APIの違い

GraphQLとREST APIは、どちらもクライアントとサーバーがデータをやり取りするための仕組みですが、入り口の数やデータの返し方が根本的に異なります。混同されやすいので、主要な観点で整理しておきましょう。

比較観点GraphQLREST API
エンドポイント原則1つに集約リソースごとに複数
データの取得欲しい項目を指定し1回で取得決まった単位で返却され過不足が出やすい
型システムスキーマによる強い型付け形式は緩く受け手が解釈
向いた場面画面ごとに必要データが変わるアプリ単純な取得やファイル操作

【まとめ】GraphQLの3つのポイント

  • 欲しい形を書いて頼む注文窓口:クライアントが必要な項目を指定し、1回のリクエストでまとめて受け取れるAPI用のクエリ言語です。
  • 通信の無駄を削ってフロントを自走させる:オーバーフェッチとアンダーフェッチを抑え、画面側が主導でデータを組み立てられます。
  • 自由さの裏の負荷に備える:深い欲張りクエリはサーバーを圧迫するため、深さ制限やコスト解析の設計を忘れないことが肝心です。

よくある質問

Q
GraphQLは何ができるものですか?
A

クライアントが欲しいデータの形を指定して、1回のリクエストで過不足なく取得できます。複数のREST APIを呼び分けていた処理を1つの窓口にまとめられるため、通信回数の削減や表示の高速化に役立ちます。書き込み処理や、更新をリアルタイムに受け取る用途にも対応します。

Q
GraphQLはどんなサービスで使われていますか?
A

もともとはFacebookがモバイルアプリの通信を効率化するために生み出した技術です。現在はSNSやECサイト、社内システムの連携基盤など、画面ごとに必要なデータが細かく変わるサービスで広く採用されています。開発者向けのプラットフォームがAPIとして提供しているケースも増えています。

Q
GraphQLのデメリットは何ですか?
A

自由に項目を指定できる分、設計を誤るとサーバー負荷が読みにくくなる点が代表的な弱点です。深くネストした重いクエリを許すと処理が集中し、キャッシュの扱いもRESTより複雑になります。導入前にクエリの深さ制限や監視の仕組みを整えておくことが、安定運用のカギになります。

Q
GraphQLとREST APIとの違いは何ですか?
A

入り口の数とデータの返し方が最大の違いです。REST APIはリソースごとに複数のエンドポイントを持ち、決まった単位でデータを返すのに対し、GraphQLは原則1つのエンドポイントで、クライアントが指定した項目だけを返します。単純な取得はREST、画面ごとに必要データが変わる場面はGraphQLが向いており、両者を併用する設計も一般的です。

GraphQLと一緒に知っておきたい用語

用語この記事との関連
REST APIGraphQLと対比される代表的なAPI設計。違いを知ると使い分けが理解できる。
APIGraphQLはソフト同士をつなぐAPIの一種で、その中のクエリ言語にあたる。
JSONGraphQLがデータを返すときの標準的な形式。応答の読み方に直結する。
データベースGraphQLが実際に取得してくるデータの保管先。窓口と保管庫の関係にある。
Webhookサーバー起点で通知を送る仕組みで、クライアント主導のGraphQLと対照的。

【出典】参考URL

https://aws.amazon.com/compare/the-difference-between-graphql-and-rest/:GraphQLの定義、単一エンドポイント・強い型付け・RESTとの違いの根拠。
https://hasura.io/learn/ja/graphql/intro-graphql/graphql-vs-rest/:単一エンドポイントでの必要データ取得とスキーマによる型検証の根拠。
https://engineering.fb.com/2015/09/14/core-infra/graphql-a-data-query-language/:2012年の社内開発開始と2015年のオープンソース公開の根拠。
https://en.wikipedia.org/wiki/GraphQL:2012年開発・2015年公開・2018年GraphQL Foundation移管という年表の根拠。

コメント

「IT用語、難しすぎて心が折れそう……」という方のための、ハードル低めな用語辞典です。

情報レベルは「基礎中の基礎」。会話を止めないためのエッセンスだけを抽出しています。分かりやすさを追求するあまり、時々例え話が暴走しているかもしれませんが、そこは「ほどよく」聞き流していただけると幸いです。
ほどよくIT用語辞典システム開発・テクノロジー
デプロイ太郎のSNSを見てみる!!