대용량 데이터의 처리와 통계 데이터 활용을 위해 활용되는 Spring Batch, 알아보자. 알아볼 내용은 대부분 출처의 내용을 기반으로 공부했으며, SpringBoot 3.x 이상, Spring Batch 5 이상 버전에서 위 출처의 내용이 어떻게 적용될 수 있을지 따라가본다.
대용량의 데이터를 단발성으로 처리하기 위해서 만들어졌다.
위처럼 Spring Batch는 정해주는 시간에 따라 돌아가고, 사용자가 요청 할 때만 그 데이터를 전달하면 됨.
테스트를 해 볼 환경은
SpringBoot 3.0.5 (아마 최신) + Gradle
Java 17
모든 코드는 : https://github.com/ca1af/Play_ground
dependencies {
// Spring Batch
implementation 'org.springframework.boot:spring-boot-starter-batch'
// Spring Data JPA
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// h2 DB
implementation 'com.h2database:h2'
// 스프링 웹
implementation 'org.springframework.boot:spring-boot-starter-web'
// 롬복
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
# Spring Batch Job enable
spring.batch.job.enabled=true
# H2 DATABASE Setting
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:db;MODE=MYSQL;
spring.datasource.username=sa
spring.datasource.password=
# Hibernate
spring.jpa.hibernate.ddl-auto = create
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
버전에 따라 달라진다.
JobBuilderFactory 의존 주입 후 사용 (선생님 방식)
먼저 SpringBootApplication 에 @EnableBatchProcessing 어노테이션을 통해서 Spring Batch 기능을 활성화한다
@Slf4j // log 사용을 위한 lombok 어노테이션
@RequiredArgsConstructor // 생성자 DI를 위한 lombok 어노테이션
@Configuration
public class SimpleJobConfiguration {
private final JobBuilderFactory jobBuilderFactory; // 생성자 DI 받음
private final StepBuilderFactory stepBuilderFactory; // 생성자 DI 받음
@Bean
public Job simpleJob() {
return jobBuilderFactory.get("simpleJob")
.start(simpleStep1())
.build();
}
@Bean
public Step simpleStep1() {
return stepBuilderFactory.get("simpleStep1")
.tasklet((contribution, chunkContext) -> {
log.info(">>>>> This is Step1");
return RepeatStatus.FINISHED;
})
.build();
}
}
위 참고 블로그는 2018년 기준이라, JobBuilderFactory 를 사용하지만(4.x 버전까지는) 새로운 버전은 JobBuilder 객체를 사용하기를 권장한다
Builder에서 JobRepository가 생성되고 설정된다는 사실은 문서를 참고하기 전까지는 알 수 없다. 따라서 5.x 버전 이후로는 JobBuilder 객체를 직접 사용하여 아래와 같이 설정하는 것이 권장된다
2, SpringBoot 3.0.0 이상 버전의 방식
@EnableBatchProcessing 사용하지 않는다!
스프링 3.0 마이그레이션 가이드를 살펴보면, @EnableBatchProcessing 사용 시 Spring Batch 기본 설정이 백오프된다고 설명된다.
꺼주자.
아래는 위의 예제 코드를 SpringBoot 3.~ 버전으로 만들어 본 결과이다.
@Slf4j
@Configuration
public class SimpleJobConfiguration {
@Bean
public Job simpleJob1(JobRepository jobRepository, Step simpleStep1) {
return new JobBuilder("simpleJob", jobRepository)
.start(simpleStep1)
.build();
}
@Bean
public Step simpleStep1(JobRepository jobRepository, Tasklet testTasklet, PlatformTransactionManager platformTransactionManager){
return new StepBuilder("simpleStep1", jobRepository)
.tasklet(testTasklet, platformTransactionManager).build();
}
@Bean
public Tasklet testTasklet(){
return ((contribution, chunkContext) -> {
log.info(">>>>> This is Step1");
return RepeatStatus.FINISHED;
});
}
}
잘 동작하는 모습!
다음 시간에는 좀 더 복잡한 것을 해볼 예정
spring batch5 자료가 너~무 없네요..
여기 글 잘 보고 있습니다.
simpleJob1 이것은 어떻게 실행이 되나요?