2024.12.19
74歳の事務員がたった1人で請求業務を担当…… 作業時間を105時間→10時間まで削減させた、介護DX成功の舞台裏
リンクをコピー
記事をブックマーク
山本祥太氏:ここからは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の関連のツールを入れていて、これからも追加していく予定なので、興味のある方はぜひ見に来てください。
これで僕の発表は以上です。少しでも発表に興味をもってもらえたら幸いです。ありがとうございました。
2025.01.16
社内プレゼンは時間のムダ パワポ資料のプロが重視する、「ペライチ資料」で意見を通すこと
2025.01.15
若手がごろごろ辞める会社で「給料を5万円アップ」するも効果なし… 従業員のモチベーションを上げるために必要なことは何か
2025.01.09
マッキンゼーのマネージャーが「資料を作る前」に準備する すべてのアウトプットを支える論理的なフレームワーク
2025.01.14
コンサルが「理由は3つあります」と前置きする理由 マッキンゼー流、プレゼンの質を向上させる具体的Tips
2025.01.07
1月から始めたい「日記」を書く習慣 ビジネスパーソンにおすすめな3つの理由
2025.01.14
目標がなく悩む若手、育成を放棄する管理職… 社員をやる気にさせる「等級制度」を作るための第一歩
2025.01.10
プレゼンで突っ込まれそうなポイントの事前準備術 マッキンゼー流、顧客や上司の「意思決定」を加速させる工夫
2025.01.07
資料は3日前に完成 「伝え方」で差がつく、マッキンゼー流プレゼン準備術
2017.03.05
地面からつららが伸びる? 氷がもたらす不思議な現象
2025.01.08
職場にいる「嫌われた上司」がたどる末路 よくあるダメな嫌われ方・良い嫌われ方の違いとは
安野たかひろ氏・AIプロジェクト「デジタル民主主義2030」立ち上げ会見
2025.01.16 - 2025.01.16
国際コーチング連盟認定のプロフェッショナルコーチ”あべき光司”先生新刊『リーダーのためのコーチングがイチからわかる本』発売記念【オンラインイベント】
2024.12.09 - 2024.12.09
NEXT Innovation Summit 2024 in Autumn特別提供コンテンツ
2024.12.24 - 2024.12.24
プレゼンが上手くなる!5つのポイント|話し方のプロ・資料のプロが解説【カエカ 千葉様】
2024.08.31 - 2024.08.31
育て方改革第2弾!若手をつぶす等級制度、若手を育てる等級制度~等級設定のポイントから育成計画策定まで~
2024.12.18 - 2024.12.18