cprayer
Dec 24, 2025 - 2 min read

@Configuration
class BatchConfig: DefaultBatchConfigurer() {
override fun setDataSource(dataSource: DataSource) {
// do nothing
}
}@Configuration
class BatchConfig : DefaultBatchConfiguration() {
// override 하지 않으면 primary DataSource bean 이 주입됨
override fun getDataSource(): DataSource {
return datasource
}
// override 하지 않으면 primary PlatformTransactionManager bean 이 주입됨
override fun getTransactionManager(): PlatformTransactionManager {
return DataSourceTransactionManager(dataSource)
}
// BatchAutoConfiguration 가 @ConditionalOnMissingBean(value = DefaultBatchConfiguration.class, annotation = EnableBatchProcessing.class) 어노테이션을 가지고 있음
// 이로 인해 DefaultBatchConfiguration 를 상속받은 Configuration이 있으면 JobLauncherApplicationRunner 가 등록되지 않아 bean 등록
@Bean
fun jobLauncherApplicationRunner(
jobLauncher: JobLauncher,
jobExplorer: JobExplorer,
jobRepository: JobRepository,
): JobLauncherApplicationRunner = JobLauncherApplicationRunner(jobLauncher, jobExplorer, jobRepository)
companion object {
// DefaultBatchConfiguration bean lite mode(proxyBeanMethods = false)로 인해 getDataSource 메소드 내에 두면 여러 번 호출되어 동일한 DB 엔드포인트로 DDL 여러 번 발생
private val datasource = EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("org/springframework/batch/core/schema-h2.sql")
.build()
}
}Table already exists 에러가 발생하며 어플리케이션 기동이 실패함. 이전에 spring bean lite mode에 대해 공부한 적이 있어 디버깅하는 시간을 단축할 수 있었음