Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
開発生産性向上のためにGo Template Repositoryを作った話
Search
noru
November 20, 2024
1
5
開発生産性向上のためにGo Template Repositoryを作った話
noru
November 20, 2024
Tweet
Share
More Decks by noru
See All by noru
connect-goで実現するカスタムエラー
genkihirano
1
74
goplantumlの紹介
genkihirano
1
140
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
327
21k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
How To Stay Up To Date on Web Technology
chriscoyier
788
250k
RailsConf 2023
tenderlove
29
900
It's Worth the Effort
3n
183
27k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Embracing the Ebb and Flow
colly
84
4.5k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
430
Faster Mobile Websites
deanohume
305
30k
Transcript
開発生産性向上のために Go Template Repositoryを 作った話 noru / x-id:@noru86kawaii golang.tokyo #37
自己紹介 - noru - software developer - 普段はBackend (Go) を書いたり、Infra構築したり
- アプリケーション設計が好き - 最近、ポケポケにハマっています
最初に... - 今回お話しする内容は、今から運用していく予定です - 改善点や提案があれば、こっそり共有いただけると嬉しいです!
本LTで伝えたいこと - Goの新規開発が多い場合は、開発効率を上げるためにGo Template Repository も1つの選択肢として良いかも - Go Template Repositoryを作った際のライブラリ選定理由や考慮したことの一部を
紹介します
背景 - 直近、Goの新規開発に取り組むことが多かった - 自社事業 - 受託事業
各Goプロジェクトの新規開発の悩み - 似たようなカスタムラーやログ等の実装を再開発している - ライブラリ選定について都度議論している - 頻度が多いレビュー項目を減らしたい
自分なりに考えた解決策 - Go Template Repositoryを作ることで解決できるのでは? - サーバー、カスタムエラー、ログ等を実装した雛形の GitHubリポジトリ - 新規リポジトリを作成する際に選択できる
- 設定も簡単
Go Template Repositoryで悩みを解決する - 似たようなカスタムラーやログ等の実装を再開発している - Template Repositoryに組み込むことで解決 - ライブラリ選定について都度議論している
- Template Repositoryで使用しているライブラリの選定理由をドキュメント に残して、議論時間を短縮することが狙い - 各プロジェクトによって最適なライブラリは異なるので、参考程度に - 頻度が多いレビュー項目を減らしたい - Template Repositoryにサンプル実装を組み込む
- 共有ライブラリを実装する - 今回は採用しませんでした - 理由としては、メンテナンス工数をどれだけ確保できるか未知数であり、管理責任を負えないため です - Template Repositoryは、あくまで「新規開発の立ち上げを手助けする
」位置付けにしました - 各プロジェクトで、Template Repositoryを使う or 使わないを意思決定してもらう - 各プロジェクトメンバーごとで、 Template Repositoryのコードを含め責任を持つ - Template Repositoryの改善点があれば、共有していただく Go Template Repository以外の選択肢
Go Template Repositoryで実装したもの一覧 - APIサーバー - 環境変数 - ログ -
カスタムエラー - DataBase周り - APIドキュメント - CI (GitHub Actions) - Dockerでコンテナ化 - CRUDのサンプル実装 - 便利パッケージ - DI - Lint - Test - …
実装背景やライブラリの選定理由を一部紹介 - ログ - バリデーション - CRUDのサンプル実装
ログ slogライブラリを採用 - 「標準ライブラリ」なのが選定理由 - 今後のデファクトスタンダートになっていくと思っています - 調べたところ、パフォーマンス面も問題なさそう - 構造化ログで出力する内容の精査も合わせて対応
バリデーション ozzo-validationライブラリを採用 (go-playground/validatorの方がよかったかも...) - ozzo-validation - メリット - コードでバリデーションできるので、コンパイルエラーに引っかかる -
デメリット - メンテされていない - go-playground/validator - メリット - メンテされている - 構造体タグでバリデーションするので、網羅性の担保がしやすい (後ほど気付きました ) - デメリット - 構造体タグでバリデーションするので、コンパイルエラーにならない
CRUDのサンプル実装 前提 - レイヤー構造で書かれています - Domainレイヤにモデルやビジネスロジックを定義し、UseCaseレイヤでDomainレ イヤの実装を呼び出して使用する方針です (ロジックの重複防止) レビューで多かった内容 -
UseCaseレイヤにビジネスロジックを実装しているので、Domainレイヤに実装して ください
CRUDのサンプル実装 解決策 - モデルのフィールドはprivateにして、モデルに紐づくロジックを他のレイヤから publicメソッドを使わないと使えないようにした - また、配列やマップに対するロジックもDomainレイヤで実装するサンプル例も追加 した (ファーストクラスコレクション) -
都度レビューするのではなく、Goのprivateを使用してカプセル化して、仕組みで解 決する
まとめ - 新規開発を頻繁に行う場合、開発生産性向上の1選択肢として、Template Repositoryも良いかもしれません - Go Template Repositoryを作るにあたって、一部のライブラリ選定理由とサンプル 実装の意図をお伝えしました
最後に 最後までご清聴いただきありがとうございました