CRUD機能あるいはETL機能を白紙からサクっと書く場合、どんなアーキテクチャにするのがよいか(アイデアだし)
Java/Spring Bootプロジェクトの参照コード(=アーキテクチャのアイデア)
- ビルドスクリプト(依存ライブラリ)
- トップレベルのパッケージ構造
- 各パッケージに最低一つのクラス実装例
- 枯れた技術を組み合わせる(信頼できるサンプルや参考情報が手に入りやすいこと、現在および将来)
- 自動テストは任意。書くとしたら、アプリケーションサービスの動作確認(データベースアクセスまで結合、画面の自動テストなし)
"Learning Domain-Driven Design"の邦訳『ドメイン駆動設計をはじめよう』に、
業務ロジックが単純な場合、トランザクションスクリプトやアクティブレコードでサクっと作るべき
という記述があった。
業務ロジックが単純な場合、複雑な業務ロジックを独立させたドメインモデル層は、アプリケーションアーキテクチャとして不必要な複雑さを持ち込む
という捉え方。
最近、そういう作り方をしたことがなかった。(ドメインモデル層ありきのアーキテクチャばかり採用していた)
業務ロジックが単純な場合、Java/Spring Bootで、CRUDアプリケーションやETLアプリケーションを作る場合、いまどきは、どんなアーキテクチャ(実装方法)が推奨されるか?
初心者向けのサンプルではなく、ある程度経験のあるJava開発者が選択するとしたら、どんな感じになるだろうか?
- 業務ロジックは複雑にならない(バリデーションとデータ形式変換が必要十分なロジック)
- データ構造はフラット(項目が増えることはある)、階層構造にはならない
- もし要求が複雑になった場合は、拡張するのではなく、データベース設計も含めて、別のアーキテクチャで作り直す
利用者の基本情報の登録と管理(利用者本人および管理者)
郵便番号データを公開されているデータファイルからローカルのデータベースに取り込む
- レベル0:動かない ビルドスクリプトとサンプルコードのみ
- レベル1:いちおう動く
- レベル2:バリデーション、データベース制約、エラー情報の表示を実装済
- レベル3:最小限のユーザー認証
- レベル4:最小限の運用機能(ロギング、死活監視)
- 利用者(セルフサービス)
- 管理者
- 氏名
- 連絡先(電子メール、電話番号)
- 送付先(郵便番号、住所)
- 生年月日
サンプルデータ(テストデータ)は、テストデータ生成サービスなどを使って現実的なデータにすること
- 最少機能
flowchart LR
user{{利用者}}
registerSelf([基本情報を登録する])
database[(データベース)]
user --> registerSelf --> database
- 利用者のセルフサービス全機能(登録、送付先の変更、削除)
- ユーザー認証(ID=メールアドレス、パスワード=固定、ハッシュ化)
- メールでイベント発生を通知(固定文面、疑似)
flowchart LR
user{{利用者}}
registerSelf([基本情報を登録する])
updateSelf([送付先を変更する])
deleteSelf([登録内容を削除する])
notificationSelf([通知する])
database[(データベース)]
user --> registerSelf --> database
user --> updateSelf --> database
user --> deleteSelf --> database
registerSelf --> notificationSelf
updateSelf --> notificationSelf
deleteSelf --> notificationSelf
- 第二形態に、以下の管理者機能を追加する
- 扱うデータは同じ
- 機能構成や一部機能の詳細がセルフサービスと管理者では異なる部分に注意
flowchart LR
admin{{管理者}}
register([基本情報を登録する])
updateContactInfo([連絡先を変更する])
updateShipTo([送付先を変更する])
resetPassword([パスワードをリセットする])
delete([登録内容を削除する])
database[(データベース)]
admin --> register --> database
admin --> updateContactInfo --> database
admin --> updateShipTo --> database
admin --> resetPassword --> database
admin --> delete --> database
- 郵便番号データを取得して、ローカルなデータベースに取り込む
- 全件投入(任意の時点)
- 差分更新(月一回定期)
- ソースデータ
- 日本郵便のダウンロードページから取得
- ターゲット
- データベース
- データ項目は、CRUDアプリケーションの送付先の入力支援/入力検証に必要な内容
flowchart LR
source>郵便番号データ] --> etl([抽出-変換-書き込み]) --> ddatabase[(データベース)]
- 手動でダウンロード済の全件ファイルを対象に実行可能
- 手動でダウンロード済の差分ファイルを対象に実行可能
- アプリケーションの実行時にダウンロードも含めて実行可能
- 全件洗い替えか差分更新かを起動時に指定する
- スケジューラで、差分取り込みを定期実行