プログラミング Java

【SpringBoot入門】#10~ 更新機能の実装

投稿日:2021年1月9日 更新日:

概要

既に登録済みの書籍情報を画面上で編集し、更新する処理を実装します。
更新した内容が反映されていることを確認するところまでを行います。
 

フロントエンド

更新情報のリクエスト

edit.html内のformタグを再掲

/book/create へPostでリクエストすることになっているので、
Controller側でformを受信できるように実装を進めていきます。
 

バックエンド

リクエストの受信(Controller)

・メソッド名を「postUpdate」とします。
 これは送信されたリクエストメソッド(post)と処理内容(update)を組み合わせています。
 バリデーションチェックは登録時と同じように@Validatedをつけておきます。

・ISBNコードの存在チェック
 既に登録済みのISBNコードと重複しないように存在チェックを行います。
 登録時と異なり、更新前の自身のデータはチェック対象外とするため、
 除外用に自身のidを追加の引数として渡します。

・楽観ロック
 もし既に更新済みであれば、楽観ロックにより例外が送出される想定のため、
 ここで例外をキャッチしてエラーメッセージを表示させるようにします。
 (悲観ロックという方法もありますが、ロック対象が1件で処理時間もごく短いため、
 楽観ロックでも十分です)

・画面遷移
 エラーがあれば編集画面に戻します。
 エラーが無ければ検索画面に遷移させます。
 

処理の委譲(Service)

存在チェック

自身(id)を除く結果が無ければfalse[存在しない]、あればtrue(存在する)を返します。
BookRepositoryのexistsIsbnは、引数を2つ持つメソッドが無いため、
オーバーロードしたメソッドを追加で実装することになります。
 

更新処理

・変数名で更新前後のオブジェクトをわかり易く分ける
 after :更新後のオブジェクト
 bedore:更新前のオブジェクト

・更新可否のチェック
 (条件)更新前(before)が存在していること AND 更新前後Versionが同じであること
  更新前(before)が存在していないということは、何らかの処理で削除されているのでfalse
  更新前後でVersionが異なるということは、既に更新済なのでfalse
 つまり、削除もされておらず、最新の更新処理である場合に更新が行えるようになっています。

・楽観ロック例外の送出(スロー)
 上記のチェックでfalseになった場合、楽観ロックの例外(OptimisticLockingFailureException)をスローします。
 例外がスローされた場合、更新処理はロールバックされるようになっています。
 

DB接続(Repository)

existsIsbnメソッドのオーバライド

idを引数に加えたメソッドを追加しておきます。

updateメソッド

新規でメソッドを追加します。
引数にはBookオブジェクトを渡します。
 

SQL(XMLファイル定義)

existsIsbnにtestを追加

idフィールドがある場合で値が入っていれば、検索条件を追加するようにしておきます。
これで更新時には、自身のidを除いた結果だけをSELECTできるようになりました。
 

updateの追加

各カラムをUPDATEします。
処理対象は、自身(id)であり、versionが変わっておらず、有効(削除されていない)ものとします。
また、更新時にはVerisonを+1します。
これにより、バージョン管理を行っています。

更新処理の実装を確認

ISBNコードの存在チェック

 変更せずに更新可能なこと。
 変更したISBNコードが他の書籍情報で有効でない場合、更新可能な事。
 変更したISBNコードが他の書籍情報で有効な場合、エラーとなること。

更新内容の反映

 (画面上で確認可能)
 各画面項目の変更が反映されること

 (DB上で確認する)
 更新日時が更新されること
 更新者が更新されること(固定値のため、ソースコードを変更して確認してよい)
 Versionが+1されること
 

まとめ

・更新時には楽観ロックなど、他のユーザの変更内容が誤って上書きされない仕組みが必要である。
・更新時にVersionは繰り上げてバージョン管理を行うこと。

 
最後までお読み頂き、ありがとうございました!
ご意見・ご要望がありましたら、遠慮なくコメント下さい!
もし内容が良かったらランキング評価を頂けると励みになります(^^)

ランキング評価する

-プログラミング, Java
-,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

【Java入門】クラスとインスタンスの違いを分かり易い言葉で説明します。

概要 クラスとインスタンスの違いについて、できるだけ分かり易い言葉や表現で説明します。   クラス 設計書だよ。 以上です。 ほんとマジで。 どんなデータと操作が可能かを決めているだけなので設計書と表 …

映画のレイティング判定をStateパターンで実装する

ユーザが見ることができる作品を、映画のレイティングシステムに従って選別できるように実装します。 映画のレイティングシステムとは、年齢制限する規制のことです。 G:全年齢 PG12:12歳以上 R15+ …

【SpringBoot入門】#13~ 独自のエラー画面の作成

概要 何らかのエラーが発生した場合に、エラー画面を表示して対応したいことがあります。 デフォルトのwhite label Error pageのままというわけにはいかないので、 独自のエラー画面を作成 …

【SpringBoot入門】#7~ 検索画面の作成

概要 書籍情報を検索するフォーム(検索フォーム)と検索結果を表示する画面(検索結果一覧)を作成します。 検索フォームと検索結果一覧はHTMLファイルを分けて作成しています。 分けることは必須ではなく、 …

【Java】Enumを使って変更に強いコーディングをする!

概要 仕事でコード値の判定が色んなところに散らばってしまった後に、コード値の定義を変更しなければいけなくなった状況が起こりました。 Enumで定義していれば変更箇所はEnum定義だけでよかったなぁ~と …

SpringFramworkの良書

■おすすめ教材
Javaの基本を学んだ人が、次のステップとして読む本(中級者向け)

※SpringはJavaのFrameworkの1つです。
変更のしやすさ、保守性の高さが特徴です。