GraphQL における N+1 問題の解決の機構として Dataloder と呼ばれるものがあるが、Go でこれを行うときは gqlgen + graph-gophers/dataloader という組み合わせがよく使われるようだ。後者は gqlgen の公式ドキュメントからも参照されているので、gqlgen を使っていれば自然とそうなりそう。
このへんの話は 【GraphQL × Go】 N+1問題を解決するgqlgen + dataloaderの実装方法とCacheの実装オプション - LayerX エンジニアブログ などに詳しい。
さて、この dataloaders ってのを普通に使ってコードを書いてみるとわかるのだけど、ロードのためのキーとして string を、ロードされた結果として interface{} を返すような実装になっている。つまり実際にデータベースにアクセスするような処理ではキーとして渡された string を int に読み替える必要があり、dataloader から返された値を使用するには型アサーションを使う必要がある。ダルい!
ジェネリクスが導入された世なのでラッパーでも書くかと思っていたが、よく調べてみれば掲題のとおりジェネリクスが導入されたバージョンも提供されているようだった。便利ですね。
dataloader package - github.com/graph-gophers/dataloader/v7 - Go Packages
自分が入門したときは日本語で言及されている記事に行き当たらなかったので、今後のために書いておく。
サンプルとして gqlgen + dataloader v7 のコードも書いてみた。
GitHub - motemen/example-gqlgen-dataloader
ジェネリクスが導入されていないバージョンで書いたブランチもあって、diff を見てみると簡単になった様子がわかりやすい。
https://github.com/motemen/example-gqlgen-dataloader/compare/dataloader-legacy..main
thunk() の結果をアレコレしなくてよいのは大変うれしい。今回の例では楽をしてキーを文字列にしているのでそのへんはありがたみが薄く見えるけど、現実的には strconv を挟まなきゃいけないので面倒なはず。