【Spring Batch】Jobについて

## はじめに
Spring Batchを使用した大量データの移行を最近行ったのでアウトプットできればと思います。
1つの記事にまとめるには情報がありすぎるので、まずはJobについて書いていければと思います。
※間違いなどがあれば指摘していただけますと幸いです。

## 想定読者
- Javaの基礎を学習済みの方
- DIやBeanについて理解している方
- これからSpring Batchを学習していきたい方

## 動作環境
言語：Java
フレームワーク : Spring Boot(Spring Batch, Spring JDBC)
ツール : PostgreSQL, VSCode, Git

## 1.Spring Batchってなに？
まずは、そもそもSpring Batchってなに？というところから解説していければと思います。
Spring Batchとは、Spring Frameworkを中心としたSpringプロジェクトのひとつで、バッチ開発用のフレームワークです。SpringがもつDIコンテナやトランザクション管理機能をベースとした、さまざまな特徴を持っています。
使用するメリットとしては、下記の点があります。

**1. 開発生産性の向上**
データの読み取り、処理、書き込みなどバッチ処理に必要な様々なコンポーネントが標準で提供されていたり、Spring Boot との統合により、依存関係の管理がしやすくなります。
また、テストフレームワークも提供されているためバッチ処理のテストも容易になります。

**2. 信頼性の向上**
データベースをトランザクションで管理するため、処理の途中でエラーが起きてもデータベースへの影響を最小限に抑えることができたり、処理が失敗した場合でも再実行が可能

Spring BatchはJava向けのオープンソースフレームワークなので学習などで使用するときはおすすめです。

## 2.Spring Batchの基本的な概念
では、Spring Batchの基本的な概念について見ていければと思いますがまずはリファレンスにも載ってある下記の図をみて基本的な概念を理解することが大切です。

![spring-batch-reference-model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3669426/207e6b64-87ce-2f2a-431e-606ba46c9eb1.png)

私はこの図を最初見た時になんとなくは分かる。だけどいざコードを書こうとすると結局よくわからないなという感じでしたが、最終的な私のイメージとしては下記のようにJobの中にStepがあって（Stepはいくつ設定してもよい）StepをとおしてItemReaderなどが動くのかな？という感じです。
実際のイメージは下のような感じです。
![スクリーンショット 2024-07-10 111844.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3669426/d8cbb93f-14ee-83ec-94d4-2144508247d9.png)

```
JobがRunのような役割をもっている（これはあくまで分かりやすく自分で解釈しているので間違っています）
↓
Jobの中に書かれているStepが順番に実行される
↓
上記の図で行くとまずStep1が通って、その中でItemReader,ItemProcessor,ItemWriterが実行される
↓
Step1が終わったら次にStep2が通って同じようにItemReader,ItemProcessor,ItemWriterが実行される
```
といった感じでとりあえずは理解しました。
※自分に分かりやすい方法で理解しているだけなので、恐らく間違っています。なので有識者の方にこの辺は聞いてみてください。

## Jobの役割
Jobはバッチ処理の定義や管理、トランザクションの管理、スケジューリングやリカバリ再実行などを行います。
とは言っても分かりづらいので例えを用いて説明してみます。

朝食を作る状況を例で使用します。この朝食作りをSpring Batchのジョブに例えてみると、、
```
⓵ジョブの定義：朝食を作るために必要なステップを考えます。
例えば、パンを焼く（Step 1）、コーヒーを淹れる（Step 2）、卵を焼く（Step 3）などです。
これらのステップが全て揃って初めて朝食が完成します。

⓶トランザクション管理：朝食の準備中に何かが失敗した場合、例えば卵を落として割ってしまったとします。
このような場合でも、最初から朝食作りをやり直すことができます。このやり直しの過程が、Spring Batchのトランザクション管理に相当します。

⓷スケジューリングと実行管理： 朝食をどの時間に準備するかを決めるとします。
例えば、毎朝7時に準備を始めると決めた場合、その時間になると自動的に朝食の準備が始まるイメージです。これがSpring Batchのジョブのスケジューリング機能です。

⓸リカバリと再実行： 朝食の準備中に何かがうまくいかなかった場合、例えばパンが焼きあがらなかったり、コーヒーがぬるかったりした場合、その部分だけを修正して再度準備を始めることができます。
この修正の過程が、Spring Batchのリカバリ機能に相当します。
```
主に⓵の部分をみるとJobの役割は、手順などをきめるものなのかなというイメージが掴めるかと思います。

実際のJobの構文としては下記のようになります。


```Java: Jobの実装
@Configuration
public class SampleConfig{

    @Bean
    public Job sampleJob(JobRepository jobRepository,PlatformTransactionManager transactionManager) {
        return new JobBuilder("sampleJob", jobRepository)
                .start(step1(jobRepository, transactionManager))
                .next(step2(jobRepository, transactionManager))
                .build();
    }

    @Bean
    public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManeger){
        //今回は何も実装していません
    }

    @Bean
    public Step step2(JobRepository jobRepository, PlatformTransactionManager transactionManeger){
        //今回は何も実装していません
    }
    
```

コードを見てみるとJobクラスでstep1→step2の順番で動くように指示しています。
そして実装したStepクラスがそれぞれ順番に呼び出されるというわけです。
これだけ見るとそんなに難しくなさそうですよね。流れを理解できると基本の部分は実装できると思います。

## まとめ
今回はJobの実装について簡単にしましたが次はStepの実装について紹介できればと思っています。
最初はわからないことでもしっかりと情報収集すれば少しずつ理解していけると思うので一緒に頑張りましょう！！