목차
# 문제
티켓팅 프로젝트를 개발하면서 Spring Batch를 이용하여 배치 잡을 구현했다. 배치 잡을 구현하면서 배치 서버 기동 시 헬스체크 테스트를 위한 배치 잡을 구현하였는데, @EnableBatchProcessing 어노테이션을 configuration 클래스에 적용했음에도 기본 잡이 실행되지 않는 문제가 발생하였다. 테스트 배치 잡의 경우 프로젝트에서 필요한 기능은 아니었기 때문에 중요한 문제는 아니었지만, 왜 동작하지 않았는지에 대해서 간단하게 정리해보고자 한다.
# 원인
문제의 원인은 SpringBoot 3.0 부터 DefaultBatchConfiguration 클래스 혹은 EnableBatchProcessing 어노테이션을 선언할 경우 배치 잡의 자동 실행하는 것을 제한하는 로직이 추가 되었기 때문이다.
@AutoConfiguration(after = { HibernateJpaAutoConfiguration.class, TransactionAutoConfiguration.class })
@ConditionalOnClass({ JobLauncher.class, DataSource.class, DatabasePopulator.class })
@ConditionalOnBean({ DataSource.class, PlatformTransactionManager.class })
@ConditionalOnMissingBean(value = DefaultBatchConfiguration.class, annotation = EnableBatchProcessing.class)
@EnableConfigurationProperties(BatchProperties.class)
@Import(DatabaseInitializationDependencyConfigurer.class)
public class BatchAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.batch.job", name = "enabled", havingValue = "true", matchIfMissing = true)
public JobLauncherApplicationRunner jobLauncherApplicationRunner(JobLauncher jobLauncher, JobExplorer jobExplorer,
JobRepository jobRepository, BatchProperties properties) {
JobLauncherApplicationRunner runner = new JobLauncherApplicationRunner(jobLauncher, jobExplorer, jobRepository);
String jobNames = properties.getJob().getName();
if (StringUtils.hasText(jobNames)) {
runner.setJobName(jobNames);
}
return runner;
}
...
}
위의 코드에서 @ConditionalOnMissingBean(value = DefaultBatchConfiguration.class, annotation = EnableBatchProcessing.class) 부분을 살펴보자. 어노테이션은 DefaultBatchConfiguration 혹은 EnableBatchProcessing이 정의된 빈이 있을 경우 스프링에 등록된 기본 빈을 사용하지 않고, 등록된 빈을 사용하게 된다.
기존의 코드에서는 빈 configuration 클래스에 @EnableBatchProcessing 어노테이션만이 적용되어 있었고, 내부 적으로 배치 잡의 자동 실행 해주는 로직은 오버라이딩 해주지 않았다. 그렇기 때문에 빈으로 등록된 배치 잡이 서버 기동시 실행되지 않았던 것이다.
만약, 기동시 동작해야 하는 배치 잡이 있다면 등록된 배치 잡을 실행시켜주기 위한 별도의 메서드를 오버라이딩 해두어야 한다. 그렇지 않은 빈들은 jobLauncher 혹은 스케줄러를 이용해서 배치 잡을 실행시켜줄 수 있다.
public void sampleJobCaller(
final JobParameters jobParameters
) {
try {
jobLauncher.run(job, jobParameters);
} catch (
JobExecutionAlreadyRunningException |
JobInstanceAlreadyCompleteException |
JobParametersInvalidException |
JobRestartException e
) {
throw new RuntimeException(e);
}
}
'Spring Batch' 카테고리의 다른 글
[Spring Batch] 동일한 Job과 Step이 반복 실행되지 않는 문제 (0) | 2024.05.18 |
---|