こんにちは!サービス開発部の布施です。
AWS AppSync(以下 AppSync)を調べていて「ふーん、GraphQLなのか。ところでGraphQLってなんだ?よくわからん」となった方、いらっしゃるのではないでしょうか?
本記事はGraphQLについて解説し、AppSyncを初めて触る際に少しでもとっつきやすくなることを目指すブログであり、サーバーワークスアドベントカレンダー20日目の投稿です。
AppSyncとGraphQLの関係
GraphQLについて詳しく見ていく前に、そもそもAppSyncとGraphQLの関係についておさらいです。
まず、GraphQLは「APIサーバーの中で使われている技術」です。
GraphQLのAPIサーバーは
- クライアントからのリクエストの受付
- DBへのデータの追加・更新・削除
- クライアントへのレスポンス
- データの変更通知
をするサーバーだと理解していただけると良いかと思います。
※ちなみにAPIサーバーと一口に言っても、どんな役割を果たすのかはケースバイケースです。上記はあくまでもGraphQLという技術を使っているAPIサーバーの役割についてざっくりと説明しているものです。
そしてAppSyncは「とても簡単にGraphQLのAPIサーバーを構築してくれるサービス」です。
フルマネージドサービスでもあるため、サーバーとしての運用管理をAWSユーザーが行う必要はありません。
もう少し述べるとインフラ的な管理はもちろんですが、GraphQLサーバーとして動かすための内部的な設計や設定もある程度AppSyncがよしなにやってくれたりします。なにをどこまで設定してくれるのかは本ブログの趣旨からズレてしまうのでこちらでは割愛します。興味のある方はぜひ調べてみてください。
もうちょっと具体的な流れでGraphQLについて知る
GraphQLについてもうちょっと具体的な例を見てみましょう。
公式の説明では「GraphQLはクエリ言語であり、ランタイムである」とあります。
大丈夫です。ここで「クエリ言語…?ランタイム…??あぁ出た、曖昧なわかりづらい概念ね、はいはい」となってしまっても落ち込まないでください。
この辺は具体的な例で理解するとわかりやすいので順を追って解説します。
例えばクライアントがDBに保存されているユーザー情報を書き換えたいとしましょう。
この時GraphQLがわかるような命令文を考えます。 日本語がわからない英語圏の方に日本語で話しかけても通じないですよね。 なので英語圏の方には英語で喋りかけよう、GraphQLにはGraphQLがわかるように命令しよう。 こんなイメージです。
GraphQLサーバーは命令文を読み解いてDBを更新しようとします。
ところで命令文を読み解くことができるのは、そもそもクライアントが命令文をGraphQLがわかるように書いたからです。
つまり、GraphQLの書き方に則っていない命令文が送られてきても理解できません。名前が似ているからと言ってクライアントがSQLをGraphQLサーバーに送りつけても理解することはできないわけですね。
このGraphQLが理解できる命令文がクエリ言語であり、命令文を解釈したりクライアントにレスポンスを返す機能がランタイムです。
GraphQLを厳密に定義したり説明したりするのは非常に難しいです。これらの概念は抽象的なものなのです。
あくまでAPIサーバーとして使われる技術、その細かい取り決めや実行する仕組みがGraphQLである、程度の認識でOKです。
ところで「あれっ、DBとの通信はどこいったの?」と思った方、その通りです。
実はGraphQLサーバーは受け取ったクエリ言語をリゾルバと呼ばれる機能を通してDBのデータを取得・更新します。
リゾルバとは?
リゾルバとはGraphQLサーバーとデータベースの間に入ってクエリを実行したり、取得したデータをGraphQLサーバーにレスポンスする役割を持った関数のことです。広義にはプログラムと実行する環境のことです。
つまり、序盤に説明した
この図は一部省略があります。
本来はリゾルバが存在しているのでこうなりますね。
図ではリゾルバがGraphQLのAPIサーバーと別のサーバー上で実行しているみたいに見えますが、 同一のサーバー上で動かすこともできます。この辺は設定次第ですね。
あくまでGraphQLのランタイムではクライアントから送られてきたクエリを解釈して、 内容に応じてどのリゾルバを実行させるのかに焦点が当たっており、 実際にデータベースを操作するのはあくまでリゾルバーと、役割を分担しているわけです。
ちなみにAppSyncで背後のデータベースが1種類の場合、特にリゾルバーを記載する必要はありません。自動的に用意してくれます。これが冒頭にお伝えした「内部的な設計や設定もある程度AppSyncがよしなにやってくれる」ことの1つです。
終わりに
どうでしょう?GraphQLの概念が少しでも整理できたでしょうか?
GraphQLの成り立ちにREST APIのオーバーフェッチングやアンダーフェッチングを解消するためといった目的があります。
技術ができあがった背景を知っていた方が理解が進みやすい反面、そのためにはREST APIやフロントエンドでfetchするところに馴染みがないとGraphQLを理解し難いように思います。
AppSyncを使いたいのにGraphQLがよく分からない、知らない言葉がたくさん出てきてしまい、何が何だかわからなくなってしまった。そんな方の助けになれば幸いです。