ControllerとActionは同義
Service ロジックを記述する
→ロジックだったりデータ取得を記述する
Dto(Data Transfer Object)
→formから受け取ったデータが入っている
Entity(DBの形を定義する箱)
→DBの型が定義されている箱
Mapper(DtoをEntityに入れる作業をする場所)
→Entity = Dto みたいな感じの受け渡しをする場所
Dao(データを入れる実装部分)
→dao.insert(entity) のよう実際にDBにアクセスする
画面から送られてきたデータをDBに保存する
[画面のフォーム]
│
▼ 【Controller / Action】がリクエストをキャッチ!
┌──┴──────────────────────────────────────┐
│ データを【Dto】という仮の箱に入れる │
└──┬──────────────────────────────────────┘
│
▼ 【Service】に箱が引き渡される(ここからディープな内部処理)
┌──┴──────────────────────────────────────┐
│ ① 業務ロジック(データのチェックなど)を実行│
│ ② 【Mapper】を使って、値を詰め替える! │
│ 👉 entity = dto(DBの型に変身) │
└──┬──────────────────────────────────────┘
│
▼ 【Dao】という職人に、変身した【Entity】を手渡す!
┌──┴──────────────────────────────────────┐
│ 【Dao】の実装クラスがSQLを組み立てて、 │
│ 実際にデータベースへガチッと insert する!│
└──┬──────────────────────────────────────┘
│
▼
[データベース] ── 保存完了!
今度は、DBから取得したデータを画面へ渡す
[データベース] ── データ(レコード)が存在
│
▼ 【Dao】がDBからデータを引っ張ってくる!
┌──┴──────────────────────────────────────┐
│ 取得したデータを、DBの型である │
│ 【Entity】という本番用の箱に詰める │
└──┬──────────────────────────────────────┘
│
▼ 【Service】に【Entity】が引き渡される(外へ向かう処理)
┌──┴──────────────────────────────────────┐
│ ① 必要に応じて業務ロジック(加工など)を実行│
│ ② 【Mapper】を使って、値を詰め替える! │
│ 👉 dto = entity(画面用の型に変身) │
└──┬──────────────────────────────────────┘
│
▼ 【Controller / Action】に、変身した【Dto】を返す!
┌──┴──────────────────────────────────────┐
│ 画面に見せたくない情報(内部IDやパスワードなど)│
│ が除外された、綺麗な【Dto】を受け取る │
└──┬──────────────────────────────────────┘
│
▼ 【Dto】のデータを画面(ブラウザ)にレンダリング!
[画面のフォーム / 一覧画面] ── ユーザーの元にデータが届く!
ブラウザの画面(jsp/html)で、forなどを用いたりしながらデータを表示させることができる
この「役割分担(責務の分離)」が行われているからこそ、大規模なシステムでもコードが散らからずに、スピード感を持って開発やテストができるようになる。