プログラミング 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


関連記事

ExcelをA1で拡大率100%にするツール(サブフォルダ全て)

たくましゅくじょさんのところで公開されていた、 「エクセルで全シートの拡大率を100%にしA1セルを選択するマクロ」 をサブフォルダ全てに対応させたバージョンを作成しました。 会社の納品ドキュメントを …

【Java入門】繰り返し処理(while, for)

概要 繰り返し処理の制御構造について学んでいきましょう。 繰り返しには以下があります。 while(条件に一致する間だけ繰り返す) do-while(一度必ず実行し、その後は条件に一致する間だけ繰り返 …

pageEncodingとcontentTypeのcharsetの違い

pageEncodingとcontentTypeのcharsetは処理されるタイミングが異なります。 それによって文字化けの原因につながっているので、どのように設定すればいいかを解説していきます。 違 …

2進数を使うと判定がシンプルになる!(じゃんけんプログラム編)

概要 仕事で2進数を使った判定処理について学んだので共有したくて執筆しました。 仕事上で設計したロジックは本記事で紹介するものより複雑でしたが、本質的な部分は変わらないので使って頂けると思います。 説 …

【SpringBoot入門】#5~ 登録画面の作成

概要 共通ヘッダーの「新規登録」リンクから遷移する、書籍情報登録画面を作成します。 遷移できるようにControllerの作成と、遷移先である画面をHTMLで作成していきます。   Formクラスの作 …

記事を探す

SpringFramworkの良書

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

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