2024.12.19
システムの穴を運用でカバーしようとしてミス多発… バグが大量発生、決算が合わない状態から業務効率化を実現するまで
リンクをコピー
記事をブックマーク
山本祥太氏:ここからはgqlgencの紹介に移りたいと思います。gqlgencはIntorospectionからスキーマ情報を取得できます。なので、先ほども説明したとおり、スキーマファイルが手元になかったとしてもスキーマの情報を取得することが可能です。
定義したクエリからクライアントの型を生成できます。こちらもスキーマ情報からの型生成になっているので、間違った型が生成されることはありません。生成した型を使ったクライアントを生成します。
最後にgqlgenのプラグイン機構をベースにgqlgencは構築されています。例えばすでにgqlgenでAPIを作成しているのであれば、gqlgencをプラグインとして読み込むことによって、そのサーバーに適応したクライアントを生成することが可能です。
では次にGitHubのサンプルを見ていこうと思います。gqlgencのExampleが入っているので自由に見られます。
まずは生成に必要なConfigファイルを上から順番に見ていこうと思います。このmodelフィールドは、スキーマ情報から生成されるGoファイルに関して、どこに生成するかを指定する項目です。
次にclientは、クライアントが用意しているクエリ情報から、生成されるクライアントのファイルがどこに生成されるかを指定する項目です。
次にmodelsです。これはgqlgenでも同じような項目があります。GraphQLのデフォルトの型は、IntやFloatなどがあるのですが、それら以外の型をサーバー側では定義することが可能です。
ただそれを別の型にアサインしたいという場合は、ここに書く必要があります。例えばGitHubの場合だと、DateTimeというものが定義されているので、こちらをGoのtime.Time型に置き換えたい場合、gqlgenがそれ用のパッケージを用意していて、このgraphql.Timeを読み込むとStringではなくてtime.Time型に置き換えてくれます。
次にendpointフィールドです。これはIntorospection用のフィールドになっていて、このURLに対してリクエストヘッダーを指定することによって、Intorospectionのクエリを投げてそのスキーマ情報を取得できます。
今回GitHubのAPIですが、GitHubのAPIは少し特殊で、GitHubのトークンのスコープによってクライアントが見られるスキーマが変わってくるので、このAPIのトークンに関しては、適切なスコープを設定する必要があります。
最後にqueryフィールドです。これはクライアントが指定しているクエリファイルの在処を指す場所です。
では次に、クエリを見ていこうと思います。今回はGitHubの自分のID、名前、レポジトリを取得するクエリを用意しました。viewerが自分で、IDと名前とrepositoriesを取得します。引数として、firstとprivacyを受けるようになっていて、firstに関しては引数で受けるものです。
GraphQLやRelayに馴染みのない方は、firstがあまりわからないかなと思うのですが、これはLimitと同じような意味合いであると今は思ってもらって大丈夫です。
もう1つのprivacyという引数には、PUBLICを入れると公開レポジトリのみを取得するので、このように指定しています。
では実際に生成してみたいと思います。gqlgencと叩くと、Intorospectionクエリが叩かれて、クエリファイルを読み込んで、この2つをガッチャンコしてファイルが生成されるはずです。
2つのファイルが生成されました。models_gen.goは、スキーマファイルに書かれている型がすべてGoのstruct、ないしはtype、interfaceなどで生成されています。
もう1つがクライアントの型で、先ほど自分たちが定義したクエリに対応する型が生成されて、そのクライアントが生成されたファイルになっています。先ほどのGetUserという型はここに定義されています。GetUserという名前のstructで、viewer、ID、Name、Repositoriesと続く、クエリと同じ構造になったstructが吐かれます。
リクエストを投げるためのドキュメントも必要で、クエリ名のドキュメントも生成されます。
この2つを利用してリクエストを投げると、関数がクライアントに生えて、先ほどの引数であるfirstもきちんとGoの関数の中でも引数として受けられるようになっています。
では実際にコードを動かしてみたいと思います。GitHubのAPIトークンが環境変数にセットされているので、それを取得して、リクエストヘッダーにセットします。
クライアントをNewして、その時にhttpのクライアントとリクエストする先と、httpヘッダーをセットするためのオプションである関数をセットします。
このクライアントに対してGetUserが生えているので、あとは呼び出します。firstは引数として入れなければいけないので、今回は10件だけ取得するので10と入れます。
このコードを実行してみると……このように自分のユーザー名とレポジトリ10件が取得されているのがわかると思います。
では次に、クエリを編集して生成し直してみます。今回はcreatedAtを追加してみようと思います。gqlgencコマンドを叩いてしばらく待っていると、おそらくもう一度さっきと同じフローが走ってクライアントが生成し直されます。
これを見ると、きちんとcreatedAtが入っているのがわかると思います。先ほど説明したとおり、DateTimeをこのように変換しているので、本来であればstring型で生成されるはずなのですが、ここで生成しているおかげでtime.Time型に変換されているのがわかると思います。ドキュメントにもきちんとCreatedAtが追加されているのが見えると思います。
では今度は、これも一緒に表示してみたいと思います。このようにして、あとは実行するだけでcreatedAtがきちんと表示されます。このように、クエリを変更して、genし直してという開発フローになるので、非常に扱いやすいと思います。以上で、gqlgencの紹介は終わります。
最後に、弊社が行っているGraphQL、Go関連の活動について紹介します。最近gqlgoというGitHubのオーガナイゼーションを作成しました。こちらにはGraphQL、Goの関連のツールを入れていて、これからも追加していく予定なので、興味のある方はぜひ見に来てください。
これで僕の発表は以上です。少しでも発表に興味をもってもらえたら幸いです。ありがとうございました。
2024.12.20
日本の約10倍がん患者が殺到し、病院はキャパオーバー ジャパンハートが描く医療の未来と、カンボジアに新病院を作る理由
2024.12.19
12万通りの「資格の組み合わせ」の中で厳選された60の項目 532の資格を持つ林雄次氏の新刊『資格のかけ算』の見所
2024.12.16
32歳で成績最下位から1年でトップ営業になれた理由 売るテクニックよりも大事な「あり方」
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
PR | 2024.12.20
モンスター化したExcelが、ある日突然崩壊 昭和のガス工事会社を生まれ変わらせた、起死回生のノーコード活用術
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2024.12.18
「社長以外みんな儲かる給与設計」にした理由 経営者たちが語る、優秀な人材集め・会社を発展させるためのヒント
2024.12.17
面接で「後輩を指導できなさそう」と思われる人の伝え方 歳を重ねるほど重視される経験の「ノウハウ化」
2024.12.13
ファシリテーターは「しゃべらないほうがいい」理由 入山章栄氏が語る、心理的安全性の高い場を作るポイント
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
Climbers Startup JAPAN EXPO 2024 - 秋 -
2024.11.20 - 2024.11.21
『主体的なキャリア形成』を考える~資格のかけ算について〜
2024.12.07 - 2024.12.07
Startup CTO of the year 2024
2024.11.19 - 2024.11.19
社員の力を引き出す経営戦略〜ひとり一人が自ら成長する組織づくり〜
2024.11.20 - 2024.11.20
「確率思考」で未来を見通す 事業を成功に導く意思決定 ~エビデンス・ベースド・マーケティング思考の調査分析で事業に有効な予測手法とは~
2024.11.05 - 2024.11.05