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だけをやるメソッドをドライラン用に作っておけば、本番環境でもデータを書き換えず、安全に動作確認ができる。