【第十回】勤務時間登録画面を作る(サーバーサイド)

Javaウェブアプリ開発

はじめに

DreamHanksの松下です。

前回は勤務時間選択画面のJSPについて解説しました。

今回は勤務時間登録画面を作るために必要なデータをサーバーで生成します。
そのロジック的なところを解説していきます。

連載記事まとめ

 

勤務時間登録画面の仕様説明

①前回の選択画面で選択した月の一覧を表示する
②今月だった場合、本日(10/26)の出社時間/退社時間は前回の選択画面から参照する
③DBから取得した値(登録済みの値)分画面に描画する
④DBから取得できなかった場合(未登録の場合)空欄で描画する

ロジックの解説

今回登場するコントローラです。

このように長々とソースコードが書かれていると、処理を追うのに混乱してしまいますが
慣れてくると下記のように見えてきます。

このようにソースを見るときに、ざっくり何をしているのかを理解して
徐々に具体的に各セクションの処理を理解していきましょう。抽象 ⇒ 具体
(抽象から具体、またその具体を抽象から具体というように考えましょう)

では、次からはここを具体的に解説していきます

基準値の設定:カレンダーメソッドを使う

javaが提供している

Calendar.getInstance();をするだけで、今月(10月だとしたら10月の)カレンダーオブジェクトが生成されます。

カレンダーオブジェクトということは10/1~10/31までの日付や曜日、システム日付が入った「まとまりの箱」(オブジェクト)を生成するということです。

 

先月か今月かの判定処理

前回の選択画面で今月を「1」、先月を「0」とvalue値を決めました。
0の場合先月なので、カレンダーを先月に設定します。

 

メイン処理:選択月のユーザの勤務管理情報を取得する

コントローラ側では、計算やDB操作は行いません。
ビジネスロジックはサービス側で行うという基本を思い出してください。

 

◆コントローラ側

メンバーIDと年月を渡せば、その年月のユーザの勤務情報が取れるメソッドです。

 

文字列の”%”をなぜ文字列連結しているの?

年月例えば「202009」に%を足している理由はLIKE検索をするためです。
work_dateが2020年の9月のレコードを全て取得したいので、LIKE検索を使います。

 

DB操作を行う場合はツリー構造を思い描きながら、データ構造を意識して適切なSQL文を考えましょう。

今回の場合memberIdである程度絞れますが、同じmemberIdだとしても
その中に2020年のレコードもあれば2021のレコードもある、9月もあれば、10月もある

このようにmemberIdに対して、年と月でデータがツリー構造になっています。

◆サービス側

なぜコントローラ側(呼び元のメソッドの引数)でInteger.parseInt(worktimeChoiceForm.getMemberId())をしてStringをInteger型に変えたかというと、ビジネスロジックの汎用性を高めるためです。

このメソッド内で受け取ったStringをIntegerにPathingしていたら、他の型で着た場合に対応ができない汎用性が少ないメソッドになります。

このメソッドはいつもDBと同じ型のInteger型のmemberIdを引数で渡せば、勝手に勤務時間が取得できる。という風にしたいのです。これが汎用性が高い共通部品化されているとも言います。

mybatisの機能を使って、andWorkDateLikeを使ってさっきの文字列「yyyyMM%」を渡せば
簡単に疑似的にLIKE検索のSQL文ができます。

 

メソッドの汎用性を高めるために常に意識すること

同じロジックは2度書かない
特にデータ生成・計算ロジックは最小単位にして、共通部品化する

他のどこからメソッド呼び出しをされた場合でも、使いやすいメソッドになるように引数に何を入れるかを考える。

何をするメソッドなのか?これが最小単位なのか?を常に考える。

 

メイン処理:登録画面の画面描画するためのオブジェクトを生成する

このロジックは長くてなんだか難しいそうに思えますが、抽象から具体で考えます。

 

 

最後に

今回は「勤務時間登録画面を描画するためのオブジェクト生成」をサーバー内で行いました。

生成したオブジェクトをアトリビュートし、jspでどのように使うのかを解説していきます。

 

 

 

 

 

コメント