表題の通り、クリーンアーキテクチャを実装してみたのでそのまとめ記事です。
クリーンアーキテクチャとは
このあたりは調べるとたくさん出てくるのであえて自分の言葉で説明する必要はなさそうです。
有名な図はこれですよね。
各レイヤーについて簡単にまとめます。
Enterprise Business Rules(黄色)
そのビジネスのルールそのものをカプセル化したもの。メソッドを持ったオブジェクトでもデータ構造でもOK。
Application Business Rules(赤色)
アプリケーション固有のビジネスルールをカプセル化したもの。Enterprise Business Rules層への入出力を調整し、それらに最重要のビジネスルールを実行させる。
難しい表現ではありますが主に下記のような役目があるものだと理解しています。
- Enterprise Business Rules層が処理を行えるように入力を変更
- 行った処理をDBに保存して永続化
- 出力を調整
特に「行った処理をDBに保存して永続化」の部分はこのレイヤーを象徴する部分に思えます。
Enterprise Business Rules(黄色)はビジネスのルールであって、それをアプリケーションとして反映させる役目がこのレイヤーということですね。
Interface Adapters(緑色)
このあたりから徐々に外向きの機能となっていきます。Webやモバイルのアプリケーションへの出力のためにデータ構造を調整する役目を担っています。
MVCアーキテクチャでいうとC(Controller)がこの部分を担うようになっていますね。
Frameworks & Drivers(青色)
文字通りデータベースやフレームーワークがこのレイヤーにあたります。
これらが外側にあることによって、MySQL→MariaDBに置き換えたいとか、Express→NestJSに置き換えたいといったことが比較的容易にできるようになります。
構成
今回は簡単なTODOアプリのWebAPIを実装しました。(リポジトリはこちら)
./app
├── application
│ ├── type
│ └── useCase // Application Business Rules(赤色)
├── entity // Enterprise Business Rules(黄色)
│ └── todo.ts
├── index.ts
├── infrastructure // Frameworks & Drivers(青色)
│ ├── database.ts
│ └── router
└── interface // Interface Adapters(緑色)
├── controller
├── repository
├── serializer
└── type
interface/type
やapplication/type
は型や抽象クラスを格納する場所となっています。このあたりの型を外のレイヤーから参照することによってDIP(依存性逆転の原則)を実現しています。なので内側のレイヤーは外側のレイヤーの実装に依存することはない状態となっています。
感じたこと
MVC慣れしている人には理解に時間がかかる
自分はRailsやCodeigniterといったフルスタックなフレームワークに慣れていたので、設計や実装にかなりの時間を要しました。DIPといった概念も全く触れていなかったので当初は全くわからなかったです。
あまり経験のないエンジニアの多いチームとかだと、こういったアーキテクチャは採用しないのではないかと思いました。
導入コスト高い
プロダクト初期の段階だとこのようなアーキテクチャをガッツリ取り入れることはないかなと思いました。自分の実装を見ていただけるとわかるのですが、たった1コのテーブルをWebAPIから操作するだけなのに、かなり多くのファイルを持っています。これだと初速が確実に遅くなりますし、ビジネスが当たるかわからない状況下において、いきなり取り入れるのは難しいかなと思いました。
フレームワークやライブラリの移行がかなり容易になる
感じたことというより事実なのですが、外側のレイヤーは依存がないので修正が容易になります。
例えば自分のリポジトリにおいてExpressからKoaに切り替えたいといった場合、修正する箇所はinfrastructureディレクトリ内部のファイルのみです。MySQLから他に乗り換えたいといった場合も同様です。
もちろんインターフェイスを整えるといった工数は発生しますが、修正箇所が限定的ですぐにわかるのがこのアーキテクチャの強みだなと思いました。
終わりに
クリーンアーキテクチャの勉強を通じて、技術の肥やしがまた一つ増えた感覚を覚えました。やはり定期的に自分の武器を増やす行為はしていきたいですね。