以下の記事でGraphQLの勉強記事を書いて、それからだいぶ時間が経ってしまいました。AppSyncのチュートリアルなどを通してなんとなく雰囲気がわかってきたので概要を掴むための記事を書いてみます。
https://qiita.com/hassaku_63/items/d12d36d17cce536ade66
詳細な解説はQiita - GraphQLって何?が詳しいのでそちらに譲ります。
参考
GraphQLとは
ランタイムとインタフェース、文脈によって意味するところは違うようですがこのいずれかを示します。
大事なことは「データストアの実装方法詳細には関知しない」ということです。あくまでも「GraphQLという方言によってデータのやり取りのインタフェースを取り決めできる」と言っているに過ぎない。
AWS AppSyncはGraphQLのマネージドサービスであると謳っていますが、これはデータストアの実装がいい感じに他のAWSサービスにラップされて提供される、という意味でありGraphQLという言葉そのものが意味する定義よりもAppSyncは広い概念だと言えます。
GraphQL的にはインタフェースが先にあって、裏のデータストアのことはインフラ組む人がよしなにしてね、と。
必然的に、インタフェースと実装(データストア層)を結びつけるマッピングのための何かが必要になります。このマッピングを定義する要素を、AppSyncでは(その役割の通り)リゾルバと呼んでいます。
AppSyncではDynamoDBを使うのが一般的だと思われますが、Lambda functionを使うことも可能です。
GraphQLで定義するもの
インタフェースとして、以下のような要素を備えています。
- データ形式の定義
- CRUDを担う「操作」の定義
どちらも、プログラミング言語で言うところのクラス・構造体・インタフェースに近い何かだと思っておけば良いと思います。いずれも宣言的なフォーマットで記述します。この定義に従ってデータを取り扱います。
GraphQLランタイムと実装を結びつけるもの
先ほども記述したように、リゾルバを使って定義します。
AppSyncとDynamoDBの例でいくと、例えばこういう感じ
GraphQL 「新しいUser型のデータを追加するためのCreateUserという操作を宣言する」
リゾルバ「CreateUserが呼ばれたら、DynamoDBのPutItemオペレーションに変換するための変換ルールを宣言する」
リゾルバはデータストアの実装にも関わってくるので、こちらはGraphQLというよりAppSyncの仕様です。
ユーザーがリゾルバに関して行う必要があるのは「マッピングテンプレート」の定義です。Apache Velocity Template Language (VTL)というテンプレート言語を使って記述します。実際のデータストアへの操作を実行する機能はAWSが裏でよしなにするので、ユーザーはその変換ルールをテンプレートでもって宣言してあげます。
詳細はこちら AWS - リゾルバーのマッピングテンプレートの概要
つづく
ここからはスキーマを使って実際の定義を見ていくわけですが、このへんの構文とその意味付けがいまひとつ理解できてないのでまた次回にしようと思います。
サーバーサイド側のルールである「スキーマ」と実際のリクエストの形式が似ているので、その区別を整理していくともうちょい理解が捗りそうな気がしてます。
以上。