SpringBoot

Spring Boot における各レイヤの責務

Spring Boot (Spring MVC)における各レイヤの責務をまとめる

Entity, DTO, Form の役割も書いておく

概要

Spring Bootにおける各レイヤのコンポーネント (@Controller, @Service, @Repository) を設計・実装する際に,「この処理はどのコンポーネントで実装すべきなのか?」 と迷うことがある.

NTTデータが出しているSpring MVCの詳細なプラクティス TeraSoluna を参考にその 設計基準をまとめてみる.

Springのレイヤード・アーキテクチャ

spring_layered_architecture2.png

ブラウザ

ユーザに対して,Webアプリケーションを操作するユーザインタフェースを提供する.

主な責務

ビュー

ブラウザに表示するための画面を生成する.

Webアプリの場合,以下の2パターンの実装がある:

  1. サーバ側でViewを生成するパターン(Thymeleaf)
    • 初等的なWebアプリで採用される.本コースで学ぶやり方
    • 実装しやすいが画面遷移を伴うためUXはイマイチ
  2. クライアント側でViewを生成するパターン(HTML5+JavaScript)
    • モダンなWebアプリケーションで採用される
    • 1つのHTMLページを動的に書き換えてUXを向上.SPA (Single Page Application)
    • コントローラはRestControllerとして,画面生成せずにデータだけを返す(マイクロサービス)
      • RestControllerはブラウザ以外からも呼び出せるので,ネイティブアプリにも利用できる

コントローラ

Webと業務プログラムの仲立ちをする.

ブラウザからのリクエストを受け取り,業務処理を指示し,処理結果をビューに指示する

コントローラの役割は業務ロジック(サービス)を利用するために必要な前処理・後処理を行うことであり, 業務ロジックそのものに関連する処理を行ってはならない.

主な責務

サービス

アプリケーション固有の業務ロジックを実行する.

業務ロジックは,ビジネスルールの実行,および,それに伴う業務データの参照,更新, ビジネスルールのチェックなどで構成される.

サービスのの役割は,ビジネスルールに関わる処理に専念することとし, 業務データ(Entity)のDBへの出し入れはRepositoryに委譲する.

主な仕事

参考:ControllerとServiceで実装するロジックの責任分界点について

Terasoluna より

本ガイドラインでは、ControllerとServiceで実装するロジックは、以下のルールに則って実装することを推奨する。

  1. クライアントからリクエストされたデータに対する単項目チェック、相関項目チェックはController側(Bean ValidationまたはSpring Validator)で行う。
  2. Serviceに渡すデータへの変換処理(Bean変換、型変換、形式変換など)は、ServiceではなくController側で行う。
  3. ビジネスルールに関わる処理はServiceで行う。業務データへのアクセスは、RepositoryまたはO/R Mapperに委譲する。
  4. ServiceからControllerに返却するデータ(クライアントへレスポンスするデータ)に対する値の変換処理(型変換、形式変換など)は、Serviceではなく、Controller側(Viewクラスなど)で行う。

レポジトリ

業務データの操作(CRUD)を行う.

Java Beans (POJO)で保持されたEntityを,DBに入れて永続化するが, 具体的なDB操作の詳細はService層からは隠ぺいされる.(DAOのようなもの)

Repository層の役割は,以下の2つである.

  1. Entityのライフサイクル(CRUD)を制御する操作インタフェースを提供すること
  2. Entityiの永続化を行う処理の実装を提供すること

Springの場合,CrudRepository等の出来合いのコンポーネントが用意されているので,1や2を自力で実装する必要がない.

主な仕事

DTO, Form, Entityの区別

参考文献


添付ファイル: filespring_layered_architecture2.png 1841件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-11-23 (木) 23:14:42