【graphql-go】Goで始めるGraphQL その0 【イントロダクション】
GraphQLはいいぞ
こんにちは。個人開発者の中谷ひろきです。
GraphQLはスキーマ至上主義とも言えるAPI設計で、スキーマ定義→それに従ってサーバーサイド、クライアントサイドが独立して実装していきます。スキーマ定義さえあればそれぞれの進捗にかかわらず開発できるのでスキーマはまさしく侵しがたい聖典なのです。
クライアントはクエリをhttpリクエストのボディとして発行し、サーバーはクエリをスキーマで解析(Resolve)して該当データをデータベースなどから引っ張ってきてレスポンスします。
またhttpリクエスト数を圧倒的に減らることも大きなメリットです。初回の画面表示に必要なデータはよっぽど複雑でない限り1回のリクエストですべて取得できます。これはGraphQLがその名の通りグラフ理論的な実装をしているため、あるデータ→それに関するあるデータ→それに関するあるデータ…と芋づる式にデータを引っ張ってこれるのです。
例えば「IDがloremipsumのユーザーがいいねした投稿の本文とそれを投稿したユーザーをフォローしているユーザーのリスト」を取得するとなると、従来のRESTfulなAPI設計では何度もリクエストを飛ばす必要がありました。
GraphQLでは以下のようなクエリをhttpリクエストのボディとして1回リクエストすれば済みます。
query {
user (
id: "loremipsum"
) {
likingPosts {
body
postUser {
followees {
id
name
}
}
}
}
}
※likingPosts
やfollowees
はリスト(配列)なので実際はページネーション用の引数を与えます。
GoでGraphQLサーバーを実装しよう!
このシリーズはスキーマを投げるフロントエンドではなく、スキーマを受け取ってレスポンスするGraphQLサーバーをGoで作ろうやっちゅう話です。先ほど出てきた「グラフ理論」についてほんの少し理解があるとGraphQL実装はスムースだと思います。
扱う予定のお話と扱わない予定のお話
扱う
- graphql-go/graphqlの大まかな使い方
- オブジェクト型、スカラー型、列挙型の定義
- スキーマの実装
- Query操作 (Read:取得)
- Mutation操作 (Create:作成、Update:更新、Delete:削除)
扱わない
- GraphQLの仕様
- Goの言語仕様
- 認証をGraphQLスキーマにまとめるかといった論の展開[1]
検討中
- Subscription操作(WebSocketによる継続的な接続)
バージョン
シリーズを通して利用する言語やライブラリのバージョン
- Go 1.15.6
- graphql-go/graphql v0.7.9 (GraphQLの実装)
- gorilla/mux v1.8.0 (httpサーバー)
- gorm v1.20.11 (データベースとのやりとり)
シリーズのリスト
第0回 イントロダクション 👈
第1回 スカラー、オブジェクト、列挙型の実装
第2回 オブジェクトとオブジェクトを関連付ける(執筆中)
第3回 Query(予定)
第4回 Mutation(予定)
自己紹介
-
僕はサインアップやログインはスキーマにまとめてます。JWTをレスポンスしてます。 ↩︎
Discussion