🔰

クリーンアーキテクチャを理解するためにGoで簡単なテンプレを作ってみた

2023/11/20に公開

やったこと

クリーンアーキテクチャ正直よく分かってない勢から脱却するべく、既存のテンプレを元によりシンプルなテンプレを作ってみました[1]
https://github.com/Yuto-M/toggl-server

何ができるか

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つがわかりやすくてオススメです。

実装内容

  • 下記の図では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関連のコードは削除しました。

クリーンアーキテクチャ図
altテキスト

感想

クリーンアーキテクチャを記事や本で学んでも微妙にしっくりこなかったですが、手を動かしてみると理解が深まりました。
hotreloadできないとか認証機能がないとか色々改善できそうなところはありそうなので、もう少し改良してGoで軽く何か作りたい時に使いやすいテンプレにしていきたい所存です。

参考

下記のテンプレートを流用しています。
README.mdを読むだけでも勉強になりました。
https://github.com/evrone/go-clean-template

下記でテンプレを色々見た結果、今回の流用元が一番シンプルだったので採用しました。
https://zenn.dev/naoki_kuroda/articles/8a7dc8dc10f5f9

脚注
  1. リポジトリ名がtoggl-serverになっているのは元々togglのAPIを叩くためのバックエンドを作ろうと思っていたためです。 ↩︎

  2. 引用元: https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html ↩︎

Discussion