지난 Spring Batch 적용하기에 이어 Job에 대해 공부해보고자 한다.
Job Interface
spring batch에 구현되어있는 Job Interface 이다.
Job의 이름, 재시작 여부, 실행, Job 파라미터와
관련된 메서드들을 포함하고 있는 모습이다.

Job 클래스 구조
클래스 구조도이다.
Job 인터페이스를 최상위로
AbstractJob 클래스와 GroupAwareJob 클래스가 하위에 존재한다.
먼저 GroupAwareJob은 말그대로 Job을 그룹화하는 역할을 한다.
AbstractJob은 하위에 SimpleJob과 FlowJob을 가진다.
여기서 AbstractJob은 자주 변하지 않는 로직을 포함하고,
SimpleJob과 FlowJob은 자주 변하는 로직을 포함한다.
FlowJob의 경우에는 Flow 객체를 사용하여
복잡한 흐름 제어, 분기, 병렬 실행등을 정의한다.
예를 들어, 특정 단계가 실패했을 때 다른 단계를 실행하거나,
특정 조건에 따라 흐름을 분기할 수 있다.

SimpleJob
SimpleJob의 경우에는 단순한 단계 기반의 작업을 정의하는 클래스로,
배치 작업을 단계(Step) 단위로 나누어 순차적으로 실행한다.

아래는 SimpleJob의 doExecute 메서드인데,
for문을 반복하면서 step들을 실행시키는 것을 확인할 수 있다.

그리고 Spring Batch에서는 Buider 패턴을 사용하여
SimpleJobBuilder를 제공하고 있다.

Builder에서 제공하는 메서드들과 관련하여 간단히 설명하자면,
먼저 Job의 경우에 실행이 실패했을 때 재시작하는 것이 dafault 값인데,
이를 JobBuider의 preventRestart() 메서드를 통해 막을 수 있다.

다음으로 Job의 경우에 동일한 JobParameter로는 실행을 할 수 없기 때문에
JobParameterIncrementer 인터페이스를 구현하여 JobParameter의 변경없이
Job을 실행시킬 수 있도록 한다.
Spring Batch에서는 이미 RunIncrementer라는 구현체를 제공하고 있기 때문에
사용자는 해당 구현체를 사용하면 된다.

RunIncrementer를 사용하면 아래와 같은 결과를 얻을 수 있다.

다음으로 JobParametersValidator의 경우에는
입력받은 JobParameter 값을 검증해준다.

사용할때는 JobParametersValidator 인터페이스를 구현하여 사용하면 된다.
아래는 구현체의 예시이다.

물론 Spring Batch에서 기본적으로 구현해놓은 구현체도 존재한다.

마지막으로 JobExecutionListener 이다.
스프링 배치 실행 중 Job 실행 전/후 로직을 추가하는 기능을 제공한다.

참고
해당 개념들에 대한 실습은 깃허브 페이지의 Spring Batch 프로젝트에서
확인할 수 있고, 내용에 맞는 커밋메시지를 클릭하면 관련 코드를 볼 수 있다.