개요
대용량 데이터의 처리와 통계 데이터 활용을 위해 활용되는 Spring Batch, 알아보자. 알아볼 내용은 대부분 출처의 내용을 기반으로 공부했으며, SpringBoot 3.x 이상, Spring Batch 5 이상 버전에서 위 출처의 내용이 어떻게 적용될 수 있을지 따라가본다.
1. Spring Batch?
대용량의 데이터를 단발성으로 처리하기 위해서 만들어졌다.
- 예를 들어 상품의 주문량 파악, 결산 금액 파악, ERP 데이터 활용 등
- 하루 주문량을 Spring Batch를 이용해 저장하고, 저장된 데이터를 사용자가 요청할 때만 다시 볼 수 있도록 하는 식
위처럼 Spring Batch는 정해주는 시간에 따라 돌아가고, 사용자가 요청 할 때만 그 데이터를 전달하면 됨.
배치 어플리케이션의 조건
- 대용량 데이터
- 배치 어플리케이션은 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등의 처리를 할 수 있어야 합니다.
- 자동화
- 배치 어플리케이션은 심각한 문제 해결을 제외하고는 사용자 개입 없이 실행되어야 합니다.
- 견고성
- 배치 어플리케이션은 잘못된 데이터를 충돌/중단 없이 처리할 수 있어야 합니다.
- 신뢰성
- 배치 어플리케이션은 무엇이 잘못되었는지를 추적할 수 있어야 합니다. (로깅, 알림)
- 성능
- 배치 어플리케이션은 지정한 시간 안에 처리를 완료하거나 동시에 실행되는 다른 어플리케이션을 방해하지 않도록 수행되어야합니다.
2. 실제로 시작해보자!
테스트를 해 볼 환경은
SpringBoot 3.0.5 (아마 최신) + Gradle
Java 17
모든 코드는 : https://github.com/ca1af/Play_ground
2 - 1. build.gradle
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'
}
2 - 2. application.properties
# 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
2 - 3 시작하기
버전에 따라 달라진다.
- SpringBoot 2.~ 버전 링크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 이상 버전의 방식
중요!!! SpringBoot 3.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;
});
}
}
'Study > Spring' 카테고리의 다른 글
[Spring] @Component와 @Configuration (0) | 2024.02.06 |
---|---|
[Spring Security] 스프링 시큐리티 세션 정책 (Session Creation Policy) (0) | 2024.02.06 |
Spring Security의 동작 구조 (0) | 2023.06.12 |
[Spring] 빈 등록을 위한 어노테이션 @Bean, @Configuration, @Component 차이 및 비교 (0) | 2023.05.09 |
HTTP HEAD 메소드 (0) | 2023.04.05 |
댓글