目次
1章 Springを使った開発現場の今
1-1 Springプロジェクトとは
- 1-1-1 フレームワークとは
- 1-1-2 Spring Frameworkとは
- 1-1-3 Springプロジェクトの全体像
- 1-1-4 本書で使用する開発環境
- 1-1-5 Springが選ばれる理由
1-2 サーバーレンダリングからAPI連携へ
- 1-2-1 Springで作るWebアプリケーション
- 1-2-2 サーバーレンダリングとは
- 1-2-3 API連携の構成とは
- 1-2-4 なぜAPI連携が主流になったのか
1-3 サービス層のjar ファイル作成
- 1-3-1 サービス層とは
- 1-3-2 jarファイル作成とは
- 1-3-3 jarファイルにするとどうなるか
- 1-3-4 本書でのjarファイル作成の位置づけ
1-4 API連携の利点と注意点
- 1-4-1 テストのしやすさ
- 1-4-2 スケーラビリティの向上
- 1-4-3 スキーマ駆動開発による効率化
- 1-4-4 API連携の注意点
1-5 本書で作るシステム全体像
- 1-5-1 作成するアプリケーション
- 1-5-2 システムの最終形
- 1-5-3 学習のロードマップ
- 1-5-4 本書の学び方
2章 レイヤー分離を意識した設計
2-1 プロジェクトの作成
- 2-1-1 Spring Initializrとは
- 2-1-2 プロジェクトの作成手順
- 2-1-3 Eclipseへのインポート
- 2-1-4 プロジェクトの初期構成
2-2 責務の整理
- 2-2-1 なぜ責務を分けるのか
- 2-2-2 MVCモデルとレイヤー
- 2-2-3 MVCを発展させた3つの層
- 2-2-4 3つの層の関係
- 2-2-5 責務を分けることで得られるメリット
2-3 Form/Entity/Repositoryの役割の整理
- 2-3-1 層の間でのデータの受け渡し
- 2-3-2 Entity-業務データの表現を担当
- 2-3-3 Form-画面とのやりとりを担当
- 2-3-4 Repository-データの保存・取得を担当
- 2-3-5 3つの役割の整理
2-4 依存方向とパッケージ構成の設計
- 2-4-1 依存方向とは
- 2-4-2 サービス層の独立
- 2-4-3 なぜ依存方向を守るのか
- 2-4-4 パッケージ構成の設計
- 2-4-5 パッケージの作成
3章 テスティングフレームワークの導入
3-1 テストの考え方
- 3-1-1 なぜテストを書くのか
- 3-1-2 単体テストと結合テスト
- 3-1-3 本書のテスト戦略
3-2 JUnitとMockito の導入
- 3-2-1 JUnitとは
- 3-2-2 はじめてのJUnitテスト
- 3-2-3 テストの書き方のパターン
- 3-2-4 Mockitoとは
- 3-2-5 Mockitoの基本的な使い方
3-3 Spring Boot TestとMockMvcの導入
- 3-3-1 Spring Boot Testとは
- 3-3-2 MockMvcとは
- 3-3-3 MockMvcの基本的な使い方
- 3-3-4 テストの道具の使い分け
4章 サービス層の実装
4-1 サービス層の役割
- 4-1-1 サービス層が担当すること
- 4-1-2 この章で作成するクラス
4-2 EntityとRepositoryの作成
- 4-2-1 TaskEntityの作成
- 4-2-2 TaskRepositoryインターフェースの作成
4-3 Service の作成
- 4-3-1 DIとは何か
- 4-3-2 TaskServiceの作成
- 4-3-3 @Serviceアノテーションの役割
- 4-3-4 現時点のサービス層の構成
4-4 サービス層のテスト
- 4-4-1 テストクラスの作成
- 4-4-2 findAllのテスト
- 4-4-3 findByIdのテスト
- 4-4-4 saveのテスト
- 4-4-5 deleteByIdのテスト
- 4-4-6 テストの実行
5章 永続化層の実装
5-1 永続化層とRepositoryの作成
- 5-1-1 永続化層が担当すること
- 5-1-2 なぜListから始めるのか
- 5-1-3 この章で作成するクラス
- 5-1-4 TaskListRepositoryImplの作成
- 5-1-5 各メソッドの実装
- 5-1-6 @Repositoryアノテーション
- 5-1-7 DIの流れの確認
5-2 永続化層のテスト
- 5-2-1 テストクラスの作成
- 5-2-2 @BeforeEachの役割
- 5-2-3 テストの実行
6章 プレゼンテーション層の実装
6-1 プレゼンテーション層とコントローラの作成
- 6-1-1 プレゼンテーション層が担当すること
- 6-1-2 Spring MVCのリクエスト処理フロー
- 6-1-3 この章で作成するもの
- 6-1-4 TaskControllerの作成
- 6-1-5 Thymeleafテンプレートの作成
- 6-1-6 動作確認
6-2 FormとEntityの連携
- 6-2-1 なぜFormが必要か
- 6-2-2 TaskFormの作成
- 6-2-3 FormからEntityへの変換
- 6-2-4 現時点のプロジェクト構成
6-3 プレゼンテーション層のテスト
- 6-3-1 結合テストの考え方
- 6-3-2 テストクラスの作成
- 6-3-3 タスク一覧画面のテスト
- 6-3-4 タスク詳細画面のテスト
- 6-3-5 テストの実行
- 6-3-6 3つの層のテスト戦略の整理
7章 入力処理の実装
7-1 検索処理の実装とテスト
- 7-1-1 RepositoryへのfindByKeywordメソッドの追加
- 7-1-2 ServiceとControllerへの検索処理の追加
- 7-1-3 検索フォームのテンプレートへの追加
- 7-1-4 サービス層の単体テスト
- 7-1-5 動作確認
7-2 登録処理の実装とテスト
- 7-2-1 登録処理の流れ
- 7-2-2 コントローラへの登録処理の追加
- 7-2-3 登録画面の作成
- 7-2-4 一覧画面への登録リンクの追加
- 7-2-5 テスト
- 7-2-6 動作確認
7-3 更新処理の実装とテスト
- 7-3-1 更新処理の流れ
- 7-3-2 コントローラへの更新処理の追加
- 7-3-3 編集画面の作成
- 7-3-4 一覧画面への編集リンクの追加
- 7-3-5 テスト
- 7-3-6 更新実行のテストを追加する
- 7-3-7 動作確認
7-4 削除処理の実装とテスト
- 7-4-1 削除処理の流れ
- 7-4-2 コントローラへの削除処理の追加
- 7-4-3 一覧画面への削除ボタンの追加
- 7-4-4 テスト
- 7-4-5 動作確認
8章 バリデーション処理の実装
8-1 単項目チェックの実装
- 8-1-1 Bean Validationとは
- 8-1-2 依存ライブラリの追加
- 8-1-3 バリデーションアノテーションの追加(TaskForm)
- 8-1-4 バリデーション処理の追加(コントローラ)
- 8-1-5 テスト
- 8-1-6 動作確認
8-2 相関項目チェックの実装
- 8-2-1 単項目チェックでは対応できないケース
- 8-2-2 TaskFormValidatorの作成
- 8-2-3 コントローラへの組み込み
- 8-2-4 テスト
- 8-2-5 動作確認
8-3 エラーメッセージ表示と画面再表示
- 8-3-1 Thymeleafでのエラーメッセージ表示
- 8-3-2 エラーメッセージのカスタマイズ
- 8-3-3 動作確認
9章 セッションを利用した状態管理
9-1 セッション利用の目的と注意点
- 9-1-1 HTTPはステートレスなプロトコル
- 9-1-2 セッションとは
- 9-1-3 セッションの注意点
- 9-1-4 @SessionAttributesアノテーション
9-2 検索条件の保持
- 9-2-1 現在の問題の確認
- 9-2-2 検索条件を保持するFormクラスの作成
- 9-2-3 TaskControllerへの@SessionAttributesの追加
- 9-2-4 listメソッドの修正
- 9-2-5 一覧画面のテンプレートの修正
- 9-2-6 検索条件のクリア機能の実装
- 9-2-7 テスト
- 9-2-8 動作確認
9-3 入力途中データの保持
- 9-3-1 @SessionAttributesへのtaskFormの追加
- 9-3-2 登録画面表示メソッドの修正
- 9-3-3 登録実行メソッドの修正
- 9-3-4 入力途中データ保存メソッドの追加
- 9-3-5 更新画面への対応
- 9-3-6 テスト
- 9-3-7 動作確認
10章 例外処理の共通化
10-1 例外設計の考え方
- 10-1-1 なぜ例外処理を共通化するのか
- 10-1-2 業務例外とシステム例外
- 10-1-3 本書での例外処理方針
10-2 @ExceptionHandlerの適用
- 10-2-1 TaskNotFoundExceptionの作成
- 10-2-2 TaskRepositoryのOptional
対応 - 10-2-3 TaskServiceImplの修正
- 10-2-4 TaskServiceImplTestの更新
- 10-2-5 コントローラへの@ExceptionHandlerの追加
- 10-2-6 共通エラー画面(error.html)の作成
- 10-2-7 @ExceptionHandlerのテスト
- 10-2-8 動作確認
10-3 @ControllerAdviceの適用
- 10-3-1 @ControllerAdviceとは
- 10-3-2 GlobalExceptionHandlerの作成
- 10-3-3 コントローラの@ExceptionHandlerの削除
- 10-3-4 @ExceptionHandlerと@ControllerAdviceの使い分け
10-4 共通エラー画面の整備
- 10-4-1 アプリケーション全体のスタイル追加
- 10-4-2 動作確認
10-5 例外処理のテスト
- 10-5-1 GlobalExceptionHandlerTestの作成
- 10-5-2 TaskControllerSliceTestの整理
- 10-5-3 テストの実行
11章 DB実装への切り替え
11-1 DB実装への移行
- 11-1-1 データベースへの切り替えの全体像
- 11-1-2 H2データベースの導入
- 11-1-3 依存ライブラリの追加
- 11-1-4 データベース接続の設定
- 11-1-5 テーブルの作成
- 11-1-6 初期データの投入
- 11-1-7 サービス層は変更不要
11-2 MyBatisによる永続化処理
- 11-2-1 MyBatisとは
- 11-2-2 TaskMapperインターフェースの作成
- 11-2-3 MapperXMLファイルの作成
- 11-2-4 TaskDbRepositoryImplの作成
- 11-2-5 実装の切り替え
- 11-2-6 ファイル構成の確認
- 11-2-7 動作確認
11-3 DB実装のテスト
- 11-3-1 結合テストとは
- 11-3-2 テストクラスの作成
- 11-3-3 @Transactionalによるデータクリーンアップ
- 11-3-4 テストの実行
- 11-3-5 ポリモーフィズムの効果の確認
12章 2テーブル構成によるトランザクション管理
12-1 2テーブル構成の設計
- 12-1-1 なぜ2テーブルが必要か
- 12-1-2 CategoryEntityの作成
- 12-1-3 テーブル定義の追加
- 12-1-4 TaskEntityにcategoryIdを追加
- 12-1-5 CategoryMapperとCategoryRepositoryの作成
- 12-1-6 TaskMapper.xmlの修正
- 12-1-7 既存コードへの影響と対処
12-2 トランザクション処理の実装
- 12-2-1 トランザクションとは
- 12-2-2 @Transactionalアノテーション
- 12-2-3 TaskServiceImplへのトランザクション適用
- 12-2-4 トランザクションの動作確認
- 12-2-5 ロールバックが発生するケース
12-3 ロールバック確認とテスト
- 12-3-1 例外を発生させたロールバックの確認
- 12-3-2 @Transactionalありとなしの動作比較
- 12-3-3 テストコードでのロールバックの確認
- 12-3-4 テスト用メソッドの後始末
13章 サービス層のjarファイル作成
13-1 jarファイル作成の目的
- 13-1-1 jarファイル作成のメリットの振り返り
- 13-1-2 現在のプロジェクト構成の確認
- 13-1-3 マルチプロジェクト構成とは
- 13-1-4 本章の進め方
13-2 マルチプロジェクト化と動作確認
- 13-2-1 この節で行うこと(全体ロードマップ)
- 13-2-2 4つの設定ファイルの役割
- 13-2-3 設定ファイル①(settings.gradle)
- 13-2-4 設定ファイル②(ルートのbuild.gradle)
- 13-2-5 設定ファイル③(taskapp-domain/build.gradle)
- 13-2-6 設定ファイル④(taskapp-web/build.gradle)
- 13-2-7 domainパッケージのtaskapp-domainへの移動
- 13-2-8 残りのtaskapp-webへの移動
- 13-2-9 動作確認
13-3 jarファイル作成の体感とテスト
- 13-3-1 この節で行うこと(全体ロードマップ)
- 13-3-2 jarファイルが実際にビルドされることの確認
- 13-3-3 jarファイル作成後のプロジェクト構成
- 13-3-4 既存のテストのtaskapp-domainへの移動と動作確認
- 13-3-5 taskapp-webがtaskapp-domain.jarを参照していることの確認
- 13-3-6 コンポーネントスキャンの境界