dry runできるバッチづくり
dry run(ドライラン)で、データの書き換えをしないでバッチの動作確認をしたい!
どうする
例。
契約に対して状態ごとに値引きするバッチを考える。
初めて動かす時とかは
- 割引処理対象者は誰か
- いくら値引きするのか
などが正しく判定できているか、知りたくなると思う。
でも普通に動かすとデータが書き換わってしまう。
- 永続化される直前の状態が知りたい
- でも永続化はしてほしくない
→これを確認できるように、「ドライラン」できるメソッドを用意する。
イメージ
たとえばservice層でやることを以下の3つに分ける。
1. 各種リポジトリを呼んで、業務に必要なドメインを集める。
2. ドメインサービスを呼ぶ。ドメインサービスは1で集めたいろんなドメインを使って業務的な処理をする。
(ドメインサービスはドメイン層なので、リポジトリは原則呼ばない。)
3. データソース層呼ぶ。永続化。
DiscountApService.java
... public void run(Id id) { // 1.ドメイン集める Engagement engagement = engagementRepository.find(id); DiscountInfo discountInfo = discountRepository.find(id); // 2.集めたドメインをサービスに渡す DiscountEvent event = DiscountService.judge(engagement, discountInfo); // 3. 処理結果を永続化する save(discountInfo, id); sendMail(discountInfo, id); } // ドライラン public DiscountEvent dryRun(Id id) { // 1.ドメイン集める Engagement engagement = engagementRepository.find(id); DiscountInfo discountInfo = discountRepository.find(id); // 2.集めたドメインをサービスに渡す DiscountEvent event = DiscountService.judge(engagement, discountInfo); // x.永続化はしないで処理結果を返す return event; } ...
こんなかんじのイメージ
1と2だけをやるメソッドをドライラン用に作っておけば、本番環境でもデータを書き換えず、安全に動作確認ができる。