🔰
クリーンアーキテクチャを理解するためにGoで簡単なテンプレを作ってみた
やったこと
クリーンアーキテクチャ正直よく分かってない勢から脱却するべく、既存のテンプレを元によりシンプルなテンプレを作ってみました[1]。
何ができるか
Quick startの手順でコンテナを立ち上げたら下記の手順で翻訳ができます。
curl --location 'http://localhost:8080/v1/translation/do-translate' \
--header 'Content-Type: application/json' \
--data '{
"destination": "en",
"original": "こんにちわ",
"source": "auto"
}'
# http://localhost:8080/v1/translation/historyにアクセスすると翻訳履歴が確認できます
# http://localhost:8080/swagger/index.htmlにアクセスするとswaggerが確認できます
クリーンアーキテクチャとは
ざっくり説明するとクリーンアーキテクチャは下記のような概念だと思われました。
- ページ下部のクリーンアーキテクチャ図のように、円の外側が内側に依存するような実装にする(逆に円の内側は外側に依存しないようにする)。つまり、外 -> 内はOKで、内 -> 外はダメです。
- 理由: 円の外側が変更された際にビジネスロジックに影響が出ないようにするため。実装的には修正範囲がどこかを特定しやすくするため。
- 外側は具体的なもの(ex. DBやフレームワーク)で、内側は抽象的なもの(ex. usecase(=ビジネスロジック)とEntity(=モデル))。
- 理由: 外側に具体的なものを持ってくることによって、DBをMySQLからPostgresに変更するのようなシステム的な変更をしやすくなるメリットがある。
もっとしっかり理解したい場合は、下記の2つがわかりやすくてオススメです。
- https://github.com/evrone/go-clean-template#clean-architecture
- https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
実装内容
- 下記の図では4つの色分けされたレイヤーがありますが、今回作ったテンプレは極力シンプルにするため3層(一番外側がwebapi・controller・Postgres、次がusecase、一番内側がEntity)です。
- interface.goでinterfaceを用意してます。interfaceを用意する理由は、usecaseとrepo・web api・controllerとの依存関係を下記の画像[2]のように内側(=usecase)に依存するようにするためです。
- 流用元はusecaseディレクトリ配下にrepoやwebapiがありますが、クリーンアーキテクチャの図的にはむしろ外側にあるので今回はusecase・repo・webapiを並列にしました。また、HTTPリクエストに対応しているだけで良かったのでRabbitMQ関連のコードは削除しました。
感想
クリーンアーキテクチャを記事や本で学んでも微妙にしっくりこなかったですが、手を動かしてみると理解が深まりました。
hotreloadできないとか認証機能がないとか色々改善できそうなところはありそうなので、もう少し改良してGoで軽く何か作りたい時に使いやすいテンプレにしていきたい所存です。
参考
下記のテンプレートを流用しています。
README.mdを読むだけでも勉強になりました。
下記でテンプレを色々見た結果、今回の流用元が一番シンプルだったので採用しました。
-
リポジトリ名がtoggl-serverになっているのは元々togglのAPIを叩くためのバックエンドを作ろうと思っていたためです。 ↩︎
-
引用元: https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html ↩︎
Discussion