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


関連記事

Observerパターンってどう使うの?を考える(商品の予約)

目的 Observerパターンの使いどころとなる状況を具体例でもって理解する。   ゴール(実現すること) 商品の予約システムにおけるユーザ通知   実装する機能 ・商品を予約する …

【Java】ArrayListの使い方まとめ

概要 ArrayListはOracleの公式ページでも明記しているクラスです。 Java SE 11 Programmer I (1Z0-815-JPN) 試験 インタフェースによる抽象化 インタフェ …

junit, テスト, junit5

【Junit5】表示名のカスタマイズ(@DisplayName)

概要 Junit5で表示名をカスタマイズする方法です。 Junit4については以下を参考にしてください。  ↓ https://irof.hateblo.jp/entry/20130124/p1 でき …

【Java】モジュールシステムの概要と実装例

概要 Javaのモジュールシステムについて、概念的なイメージと実際のコード例で理解を深めるための記事です。 読者はJava Silverの資格勉強中の方やJava入門者を想定しています。 内容は以下の …

【Java入門】クラスの継承、オーバーライド

概要 クラスの継承とは、継承元(親)のフィールド(値)、メソッド(機能)を継承先(子)に引き継がせることです。 継承先(子)では、追加のフィールド(値)、メソッド(機能)を持つことができます。 つまり …

■運営者プロフィール
IT業界10年のエンジニア。
PHP -> VBA -> Javaと渡り歩いてきて、今はJavaをメインにフリーランスエンジニアとして活躍中!

[保有資格]
・Java SE 11 Gold

一度はエンジニアを辞めざるを得なかった私が再びエンジニアとして復活した数奇な物語

SpringFramworkの良書

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

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