https://mvnrepository.com/artifact/org.springframework.batch/spring-batch-core
사용하는 빌드 툴에, 사용하고자 하는 버전을 프로젝트 의존성에 추가하자.
스프링 배치를 사용하기 위해서는 @EnableBatchProcessing
어노테이션을 적용해야 한다.
@SpringBootApplication
@EnableBatchProcessing
class SpringBatchApplication
fun main(args: Array<String>) {
runApplication<SpringBatchApplication>(*args)
}
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({BatchConfigurationSelector.class})
public @interface EnableBatchProcessing {
boolean modular() default false;
}
위 어노테이션을 보면, modular
라는 속성을 가진다. 기본값은 false 이다.
이 속성이 true 이면, ModularBatchConfiguration
이 실행되며,
false 이면 SimpleBatchConfiguration
이 실행된다.
(* Import 에 있는 BatchConfigurationSelector 코드를 보면 알 수 있다.)
modular 는 여러 Job을 동시에 실행하는 상황에서, 각 Job을 독립된 컨텍스트에서 실행하기 위해 설정한다.
일반적으로 SpringBatch 는 CronJob 과 같은 스케줄러와 함께 특정 Job만 실행시키기 때문에, modular 옵션을 사용할 일은 없다. 단지 '이런게 있다' 정도만 알아두자.
@EnableBatchProcessing
어노테이션이 붙으면 4가지 설정 클래스가 순서대로
실행된다.
SimpleBatchConfiguration
ModularBatchConfiguration
이 수행될 수도 있다.)BatchConfigurerConfiguration
: BatchConfigurer 인터페이스를 구현하여 커스텀 가능BasicBatchConfigurer
JpaBatchConfigurer
BatchAutoConfiguration
@Configuration
class HelloJobConfiguration(
val jobBuilderFactory: JobBuilderFactory,
val stepBuilderFactory: StepBuilderFactory,
) {
@Bean
fun helloJob(): Job {
return jobBuilderFactory.get("helloJob") // helloJob 이름으로 잡 생성
.start(helloStep1())
.next(helloStep2())
.build()
}
@Bean
fun helloStep1(): Step {
return stepBuilderFactory.get("helloStep1") // helloStep1 이름으로 스텝 생성
.tasklet { contribution, chunkContext ->
println(" ============================")
println(" >> Step1 executed")
println(" ============================")
RepeatStatus.FINISHED
}.build()
}
@Bean
fun helloStep2(): Step {
return stepBuilderFactory.get("helloStep2") // helloStep2 이름으로 스텝 생성
.tasklet { contribution, chunkContext ->
println(" ============================")
println(" >> Step2 executed")
println(" ============================")
RepeatStatus.FINISHED
}.build()
}
}
스프링 배치는 기본적으로 Job 생성 -> Step 실행 -> Tasklet 실행
순서로 이루어진다.
Job은 .next(Step)
메소드를 통해 여러 Step을 묶을 수 있다.
step에 정의된 tasklet은 기본적으로 무한반복이 된다.
그래서 tasklet 의 반환값을 RepeatStatus.FINISHED 로 설정함으로써 tasklet 실행이 완료되면 step을 끝낼 수 있다.
스프링 배치는 Job, Step 을 관리하고, 히스토리를 저장하는 메타데이터 DB 테이블을 가진다.
DB와 연동된다면, 필수적으로 테이블이 DB에 존재해야 한다.
의존성을 추가하고, 의존성 내부를 살펴보면 schema-*.sql
파일을 확인할 수 있다.
DB 유형별로 제공하고 있으니 자신이 사용하는 DB의 쿼리를 확인해보자.
참고로, 본 포스팅에서는 mysql을 기준으로 한다.
스키마 생성은 수동/자동 방식을 사용할 수 있다.
수동 설정 : 위에 schema-mysql.sql
파일을 직접 DB에 쿼리를 날려서 테이블을 생성해둔다.
자동 설정은 application.properties (사용하는 환경에 따라 application.yml) 으로 관리할 수 있다.
spring.batch.jdbc.initialize-schema
속성을 아래와 같이 설정할 수 있다.
실제 운영 환경에서는 수동으로 테이블을 생성한 후, EMBEDDED(DEFAULT) 나 NEVER로 사용하는 것이 권장된다.
테이블은 Job 관련 테이블과 Step 관련 테이블이 설정된다.