import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableBatchProcessing
public class PracticeApplication {
public static void main(String[] args) {
SpringApplication.run(PracticeApplication.class, args);
}
}
배치 작업에 필요한 빈을 미리 등록하여 사용할 수 있도록 해준다.
기본 포함 bean
bean name
설명
JobRepository
jobRepository
실행 중인 Job의 상태를 기록하는 데 사용
JobLauncher
jobLauncher
잡을 구동하는데 사용
JobExplorer
jobExplorer
JobRepository를 사용해 읽기 전용 작업을 수행하는데 사용
JobRegistry
jobRegistry
특정한 런처 구현체를 사용할 때 Job을 찾는 용도로 사용
PlatformTransactionManager
transactionManager
잡 진행 과정에서 트랜젝션을 다루는데 사용
JobBuilderFactory
jobBuilders
잡을 생성하는 빌더
StepBuilderFactory
stepBuilders
스텝을 생성하는 빌더
JobRepository와 PlatformTransactionManager는 필요에 따라 데이터 소스를 사용할 수 있다.
Config 설정
@EnableBatchProcessing // 스프링부트 배치 스타터에 미리 정의된 설정들을 실행시키는 어노테이션으로 JobBuilder, StepBuilder 등 다양한 설정 주입
@Configuration
public class TestJobConfig {
// Job 실행에 필요한 JobLauncher를 필드값으로 갖는 JobLauncherTestUtils를 빈으로 등록
@Bean
public JobLauncherTestUtils jobLauncherTestUtils(){
return new JobLauncherTestUtils();
}
}
DefaultBatchConfiguerer
만약 커스텀이 필요한 경우 DefaultBatchConfiguerer을 상속받아 필요한 설정만 재정의 하여 사용할 수 있다. 예를 들어, 여러 개의 DB에 접근하고 싶어 DataSource를 여러개 설정해야하는 경우이다.
@Configuration
public class DatabaseConfig {
@Bean
@Primary
public DataSource dataSource()
{
return .........;
}
}
@Configuration
@EnableBatchProcessing
@ComponentScan(basePackageClasses = DefaultBatchConfigurer.class)
public class MyBatchConfig {
}
spring:
profiles:
active: local
---
spring:
profiles: local
datasource:
hikari:
jdbc-url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
username: sa
password:
driver-class-name: org.h2.Driver
---
spring:
profiles: mysql
datasource:
hikari:
jdbc-url: jdbc:mysql://127.0.0.1:3306/spring_batch?serverTimezone=UTC
username: ${user_name}
password: ${password}
driver-class-name: com.mysql.jdbc.Driver
Active profiles에 설정한 값이 spring-profiles 값이다. 다음과 같이 설정 후 실행해주면 mysql이 기본 DB로 실행되는 것을 볼 수 있다.
지정한 Batch Job만 실행하기
spring:
profiles:
active: local
spring.batch.job.names: ${job.name:NONE}
---
Spring Batch가 수행될 때, arguments로 job.name이 넘어오면 해당 값과 일치하는 Job만 수행시킬 수 있다.
${job.name:NONE} 의 의미는 job.name이 있으면 job.name을 할당하고, 없으면 NONE을 할당하겠다는 의미이다. 여기서 NONE이 spring.batch.job.names 에 할당되면 어떠한 배치도 실행하지 않겠다는 의미이며, 혹시라도 값이 없는 경우에 모든 배치가 수행되지 않도록 막는 역할을 한다.
--job.name=stepNextJob
위 program arguments를 추가하고 수행하면 해당 name의 Job만 실행 되는 것을 확인할 수 있다.
Job: [SimpleJob: [name=stepNextJob]] launched with the following parameters: [{version=2}]
2021-01-31 19:43:59.202 INFO 20321 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step1]
2021-01-31 19:43:59.221 INFO 20321 --- [ main] s.b.p.jobs.StepNextJobConfiguration : >>> this is step1
2021-01-31 19:43:59.237 INFO 20321 --- [ main] o.s.batch.core.step.AbstractStep : Step: [step1] executed in 33ms
2021-01-31 19:43:59.303 INFO 20321 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step2]
2021-01-31 19:43:59.315 INFO 20321 --- [ main] s.b.p.jobs.StepNextJobConfiguration : >>> this is step2
2021-01-31 19:43:59.323 INFO 20321 --- [ main] o.s.batch.core.step.AbstractStep : Step: [step2] executed in 19ms
2021-01-31 19:43:59.353 INFO 20321 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step3]
2021-01-31 19:43:59.372 INFO 20321 --- [ main] s.b.p.jobs.StepNextJobConfiguration : >>> this is step3
2021-01-31 19:43:59.385 INFO 20321 --- [ main] o.s.batch.core.step.AbstractStep : Step: [step3] executed in 32ms
2021-01-31 19:43:59.402 INFO 20321 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [SimpleJob: [name=stepNextJob]] completed with the following parameters: [{version=2}] and the following status: [COMPLETED] in 258ms