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

当ページのリンクには広告が含まれています。
目次

概要

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

フロントエンド

更新情報のリクエスト

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は繰り上げてバージョン管理を行うこと。

最後までお読み頂き、ありがとうございました!
ご意見・ご要望がありましたら、遠慮なくコメント下さい!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

リーマンショックの影響で26歳の時にIT業界から離れ、紆余曲折を経て34歳でエンジニアに復帰しました。
復帰前は開発未経験でしたが、独学した知識と面接時のコミュニケーション力で見事開発エンジニアとして復帰しました!
今はフリーランスエンジニアとして仕事をしています。

■保有資格
・Java Gold SE 11

コメント

コメントする

CAPTCHA


目次