バックエンド初心者のための、クリーンアーキテクチャ超超超ざっくり解説です。
フロントエンドエンジニア歴1年半&バックエンド実務未経験の僕が、2021年4月からバックエンドとして働くにあたり勉強した備忘録です。
この記事の目的は、**「クリーンアーキテクチャ、ナンモワカラン」なレベルの人に対して、「自分でもできるかもしれない!チャレンジしてみたい!」**と一歩踏み出せる勇気を与えることです。
クリーンアーキテクチャとは
乱暴ですが、一言でまとめます。
クリーンアーキテクチャとは
「修正コストの低く・保守性の高い開発をすることを目的とし、役割と責任を適切に分けるための設計思想の一つ」です。
(クリーンアーキテクチャ = 設計における最適解!という訳ではないです。)
かつての僕
最近でこそモデルにメソッドを書くという技を覚えましたが、それまでは MVC の「C」に全てをぶちこんでいました(それ以外のやり方があるなんて知らなかった)。
いわゆる 「fat controller(ファットコントーラー)」
どれくらいfatだったのか?
1つのアクションが150行、そんなアクションが3つも4つも存在する巨大なコントローラです。書いた自分ですら見るのが嫌になるほどのファットっぷり。
副業で、クリーンアーキテクチャな設計に出会う
そんな中、2020年末頃から参画したRailsプロジェクトで、クリーンアーキテクチャな設計で書かれたコードと出会います。たしかに、僕の知ってるモデル・コントローラー以外のヤツがいっぱい登場してきます(サービス、 デコレーターなど)。
この頃から、**僕もクリーンアーキテクチャ理解した先にある向こう側の景色を見たい!**と強く思うようになりました(ミーハー精神炸裂)。
ついにあの本を手に取る
早速、『Clean Architecture 達人に学ぶソフトウェアの構造と設計』をポチる。「これさえ手に入ればおれもそっち側の住人だぜ!」という期待に胸を膨らませていました。
読んだケド、、、
、、、うん!ナンモワカラン!(終始、「何言うてますのん?」状態)
解説記事を漁る
「クリーンアーキテクチャ 解説」 で検索。
いくつか記事を読むと、だいたいこれ↓↓が出てきます。
そして、「この図を見ながら、その通りに当てはめて実装していきましょう」と結論付ける記事が多い。「いやこれ見て分かったら苦労せんわ!!!」と何度も心で叫びます。
教えて偉い人!
とりあえず自力で理解することは早々に諦め、クリーンアーキテクチャをLaravelに適用するにはどうすればいいのか偉い人に聞いてみた。
簡易的に導入するなら、まずはこんな感じ?と教えていただいたのがコントローラーとモデルをさらに分解して以下の4つに分ける方法。
- Controller(ルーティング)
- UseCase(ビジネスロジック)
- Repository(モデル操作)
- Model(DBとのやりとり)
おおーーー!!分かった気がする、、、、!?
いやちょっと待って、、、
ビジネスロジックってなに・・・?
ビジネスロジックとは
こちらの神記事によれば、
アプリケーションをプレゼンテーション・ビジネスロジック・データアクセスの 3 つに分けたとき、「プレゼンテーションでもデータアクセスでもない部分がビジネスロジック」
と考えるととっかかりやすいです。
とのことです。個人的にはこの説明がすごく理解の手助けになりました。
プレゼンテーション層
アプリケーションとユーザとのやりとりを担当する。(ビューやコントローラ)
データアクセス層
ファイルや DB に対してデータを読み書きする。(モデル)
ビジネスロジック層
プレゼンテーション層・データアクセス層「以外」
なんか分かってきた気がするぞ、、、、!!!
実際の機能で考えてみる
最後に、実際の機能で
- Controller(ルーティング)
- UseCase(ビジネスロジック)
- Repository(モデル操作)
- Model(DBとのやりとり)
に分けて考えてみます。
いいね機能
ユーザーが何らかのコンテンツを投稿し、それを別のユーザーが閲覧できる(Twitterみたいな)サービスにおける、一般的ないいね機能で考えてみます。
Controller(ルーティング)
ハートアイコンをクリックし、エンドポイント(例: /products/1/like)を叩く
UseCase(ビジネスロジック)
一人1日いいねは10件まで、自分のproductにはいいねできない などのロジックを書く
Repository(モデル操作)
バリデーションを行い、「Modelでlikesテーブルにレコード追加する処理」を呼ぶ
Model(DBとのやりとり)
likesテーブルにレコード追加
まとめ
バックエンドの現場でコードを書いたことのない人間がクリーンアーキテクチャを理解しようとしたこと自体そもそも無理があったかもしれませんし、結果としてほとんどクリーンアーキテクチャの核心的な部分には触れることができていません。
ただ、僕がそうだったように初心者はこの記事のレベルで行き詰まってしまうことになるでしょう。そんな方々の手助けになれば幸いです。
正解はないです。少しずつでもよいので、使いながら理解を深めていきましょう!!!