Spring Boot (Spring MVC)における各レイヤの責務をまとめる
Spring Bootにおける各レイヤのコンポーネント (@Controller, @Service, @Repository) を設計・実装する際に,「この処理はどのコンポーネントで実装すべきなのか?」 と迷うことがある.
NTTデータが出しているSpring MVCの詳細なプラクティス TeraSoluna を参考にその 設計基準をまとめてみる.
File not found: "layered-architecture.png" at page "SpringBoot/各レイヤの責務"[添付]
ユーザに対して,Webアプリケーションを操作するユーザインタフェースを提供する.
Webアプリの場合,一般にHTMLで実装されるが以下の2パターンの実装がある:
我々の研究室では,クライアント側で作るほうを推奨している. これは,アプリの機能をマイクロサービス(Web-API)として,HTML以外からも 呼び出したいため.
主な仕事
リクエストを受け取り処理を実行するメソッドを@View層に提供する.
リクエスト→メソッドのマッピングや入力データチェック(バリデーション),フォームやDTOとEntityの相互変換などを行う.
Controller層の役割は業務ロジック(サービス)を利用するために必要な 前処理・後処理を行うことであり,業務ロジックそのものに関連する 処理を行ってはならない.
主な仕事
アプリケーション固有の業務ロジックを実行するメソッドを@Controller層に提供する.
業務ロジックは,ビジネスルールの実行,および,それに伴う業務データの参照,更新, ビジネスルールのチェックなどで構成される.
Service層の役割は,ビジネスルールに関わる処理に専念することとし, 業務データ(Entity)のDBへの出し入れはRepositoryに委譲する.
主な仕事
Terasoluna より
本ガイドラインでは、ControllerとServiceで実装するロジックは、以下のルールに則って実装することを推奨する。
業務データ(Entity)のCRUDを行うメソッドを@Service層に提供する.
Java Beans (POJO)で保持されたEntityを,DBに入れて永続化するが, 具体的なDB操作の詳細はService層からは隠ぺいされる.(DAOのようなもの)
Repository層の役割は,(1) Entityのライフサイクル(CRUD)を制御する 操作インタフェースを提供することと,(2) Entityiの永続化を行う処理の実装を提供することである.
Springの場合,CrudRepository等の出来合いのコンポーネントが用意されているので, 自力で頑張って(1)や(2)を実装することはない.
主な仕事