トランザクションスクリプトアプリケーションをサクっと書くためのJava/Spring Bootテンプレートの検討

主題

CRUD機能あるいはETL機能を白紙からサクっと書く場合、どんなアーキテクチャにするのがよいか(アイデアだし)

当面の目標

Java/Spring Bootプロジェクトの参照コード(=アーキテクチャのアイデア)

  • ビルドスクリプト(依存ライブラリ)
  • トップレベルのパッケージ構造
  • 各パッケージに最低一つのクラス実装例

留意事項

  • 枯れた技術を組み合わせる(信頼できるサンプルや参考情報が手に入りやすいこと、現在および将来)
  • 自動テストは任意。書くとしたら、アプリケーションサービスの動作確認(データベースアクセスまで結合、画面の自動テストなし)

背景

"Learning Domain-Driven Design"の邦訳『ドメイン駆動設計をはじめよう』に、

業務ロジックが単純な場合、トランザクションスクリプトやアクティブレコードでサクっと作るべき

という記述があった。

業務ロジックが単純な場合、複雑な業務ロジックを独立させたドメインモデル層は、アプリケーションアーキテクチャとして不必要な複雑さを持ち込む

という捉え方。

最近、そういう作り方をしたことがなかった。(ドメインモデル層ありきのアーキテクチャばかり採用していた)

業務ロジックが単純な場合、Java/Spring Bootで、CRUDアプリケーションやETLアプリケーションを作る場合、いまどきは、どんなアーキテクチャ(実装方法)が推奨されるか?

初心者向けのサンプルではなく、ある程度経験のあるJava開発者が選択するとしたら、どんな感じになるだろうか?

想定

  • 業務ロジックは複雑にならない(バリデーションとデータ形式変換が必要十分なロジック)
  • データ構造はフラット(項目が増えることはある)、階層構造にはならない
  • もし要求が複雑になった場合は、拡張するのではなく、データベース設計も含めて、別のアーキテクチャで作り直す

お題(①、②どちらかを選択)

① CURD アプリケーション

利用者の基本情報の登録と管理(利用者本人および管理者)

② ETL アプリケーション

郵便番号データを公開されているデータファイルからローカルのデータベースに取り込む

実装レベルのイメージ

  • レベル0:動かない ビルドスクリプトとサンプルコードのみ
  • レベル1:いちおう動く
  • レベル2:バリデーション、データベース制約、エラー情報の表示を実装済
  • レベル3:最小限のユーザー認証
  • レベル4:最小限の運用機能(ロギング、死活監視)

① CRUDアプリケーションの概要

アクター

  • 利用者(セルフサービス)
  • 管理者

データ項目

  • 氏名
  • 連絡先(電子メール、電話番号)
  • 送付先(郵便番号、住所)
  • 生年月日

サンプルデータ(テストデータ)は、テストデータ生成サービスなどを使って現実的なデータにすること

機能

第一形態

  • 最少機能
flowchart LR

user{{利用者}}
registerSelf([基本情報を登録する])
database[(データベース)]

user --> registerSelf --> database
Loading

第二形態

  • 利用者のセルフサービス全機能(登録、送付先の変更、削除)
  • ユーザー認証(ID=メールアドレス、パスワード=固定、ハッシュ化)
  • メールでイベント発生を通知(固定文面、疑似)
flowchart LR

user{{利用者}}

registerSelf([基本情報を登録する])
updateSelf([送付先を変更する])
deleteSelf([登録内容を削除する])
notificationSelf([通知する])

database[(データベース)]

user --> registerSelf --> database
user --> updateSelf --> database
user --> deleteSelf --> database
registerSelf --> notificationSelf
updateSelf --> notificationSelf
deleteSelf --> notificationSelf
Loading

第三形態

  • 第二形態に、以下の管理者機能を追加する
  • 扱うデータは同じ
  • 機能構成や一部機能の詳細がセルフサービスと管理者では異なる部分に注意
flowchart LR

admin{{管理者}}

register([基本情報を登録する])
updateContactInfo([連絡先を変更する])
updateShipTo([送付先を変更する])
resetPassword([パスワードをリセットする])
delete([登録内容を削除する])

database[(データベース)]

admin --> register --> database
admin --> updateContactInfo --> database
admin --> updateShipTo --> database
admin --> resetPassword --> database
admin --> delete --> database
Loading

② ETLアプリケーションの概要

  • 郵便番号データを取得して、ローカルなデータベースに取り込む
    • 全件投入(任意の時点)
    • 差分更新(月一回定期)
  • ソースデータ
    • 日本郵便のダウンロードページから取得
  • ターゲット
    • データベース
    • データ項目は、CRUDアプリケーションの送付先の入力支援/入力検証に必要な内容
flowchart LR

source>郵便番号データ] --> etl([抽出-変換-書き込み]) --> ddatabase[(データベース)]
Loading

実装

第一形態

  • 手動でダウンロード済の全件ファイルを対象に実行可能

第二形態

  • 手動でダウンロード済の差分ファイルを対象に実行可能

第三形態

  • アプリケーションの実行時にダウンロードも含めて実行可能
  • 全件洗い替えか差分更新かを起動時に指定する

第四形態

  • スケジューラで、差分取り込みを定期実行