앞서 Spring Batch를 소개하고 간단한 예제를 작성하고 실행해보았다.
Spring Batch는 메타 테이블이 있어야 정상적으로 작동하고 MySQL을 사용할때는 직접 메타 테이블을 생성해야 한다고 했다.
그렇다면 메타 테이블에는 어떤 정보들이 있는지 간단히 알아보자.
BATCH_JOB_INSTANCE
BATCH_JOB_INSTANCE 테이블은 Job Parameter에 따라 생성되는 테이블이다.
Job Parameter는 Spring Batch가 실행될때 외부에서 받을 수 있는 파라미터를 의미한다.
예를 들어, 특정 날짜를 Job Parameter로 넘기면 Spring Batch에서는 해당 날짜 데이터로 조회/가공/입력 등의 작업을 할 수 있다.
@Slf4j
@RequiredArgsConstructor
@Configuration
public class ParametersSimpleJobConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job parametersSimpleJob() {
return jobBuilderFactory.get("parametersSimpleJob")
.start(parametersSimpleStep1(null))
.build();
}
@Bean
@JobScope
public Step parametersSimpleStep1(@Value("#{jobParameters[requestDate]}") String requestDate) {
return stepBuilderFactory.get("parametersSimpleStep1")
.tasklet((contribution, chunkContext) -> {
log.info(">>>>> This is parametersSimpleStep1");
log.info(">>>>> requestDate = {}", requestDate);
return RepeatStatus.FINISHED;
})
.build();
}
}
아래처럼 jobParameters에서 requestDate를 받아오는 코드를 작성하고 실행환경에서 requestDate를 설정한 뒤 실행해보겠다.
jobParameters가 다르면 Job Instance가 추가된다. 반대로 같다면 Job Instance가 추가되지 않는다.
같은 requestDate로 다시 실행하게 되면 JobInstanceAlreadyCompleteException이 발생한다.
requestDate를 변경해서 한번 테스트 해보자
정리하자면, 동일한 Job이 Job Parameter가 달라지면 그때마다 BATCH_JOB_INSTANCE에 생성되며, 동일한 Job Parameter는 여러개 존재할 수 없다.
BATCH_JOB_EXECUTION
JOB_EXECUTION와 JOB_INSTANCE는 부모-자식 관계이고, JOB_EXECUTION은 자신의 부모 JOB_INSTACNE가 성공/실패했던 모든 내역을 기록한다.
그렇다면 Job Instance가 실패하는 상황을 만들어 어떤 데이터가 쌓이는지 확인해보자.
@Bean
@JobScope
public Step parametersSimpleStep1(@Value("#{jobParameters[requestDate]}") String requestDate) {
return stepBuilderFactory.get("parametersSimpleStep1")
.tasklet((contribution, chunkContext) -> {
throw new RuntimeException("step3 실패!");
})
.build();
}
여기서 중요한 부분은 동일한 Job Parameter로 2번 실행했을때 성공한 기록이 있을때만 재수행이 안된다라는 것이다.
성공한 기록이 있다면 해당 Job은 다시 기록되지 않는다.
BATCH_JOB_EXECUTION_PARAM
BATCH_JOB_EXECUTION 테이블이 생성될 당시에 입력 받은 Job Parameter를 기록한다.
BATCH_JOB_EXECUTION_CONTEXT
스프링 배치는 ExecutionContext를 사용해 잡의 상태를 저장하는데, 재시작과 같이 스프링 배치가 여러번 실행되는 상황에서 실행 시점의 관련 정보를 저장하는 테이블이다.
더욱 자세한 내용은 Spring Batch Meta Data 공식 문서에서 확인할 수 있다.
※ 전체 코드는 GitHub에서 확인하실 수 있습니다.
'Spring' 카테고리의 다른 글
스프링 배치(Spring Batch)를 이용한 데이터 마이그레이션 (2) | 2022.02.24 |
---|---|
스프링 배치(Spring Batch) 활용하기 (0) | 2022.02.22 |
스프링 배치(Spring Batch)란? 소개 및 예제 (0) | 2022.02.22 |
H2 Database를 활용해 In-memory Database 사용하기 (0) | 2022.02.07 |
Spring Boot 유효성 검증 어노테이션 만들기 (0) | 2022.01.28 |