1. Spring batch 설정
1)Bulid.gradle에 dependency 추가
implementation 'org.springframework.boot:spring-boot-starter-batch'
2)application.properties에 annotation 설정
@EnableBatchProcessing
@SpringBootApplication
public class SpringBatchApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBatchApplication.class, args);
}
}
3)Simple Batch 코드 작성
@Slf4j
@RequiredArgsConstructor
@Configuration // Spring Batch의 모든 Job은 @Configuration으로 등록해서 사용해야 한다.
public class SimpleJobConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@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 simpleStep1");
return RepeatStatus.FINISHED;
})
.build();
}
}
4)DB 별 기초 설정(BATCH_JOB_INSTANCE)
- Spring Batch에선 메타 데이터 테이블들이 필요하다. 이것이 없다면 위와 같은 에러가 발생한다.
- 메타 데이터는 다음과 같은 내용을 담는다.
- 이전에 실행한 Job이 어떤 것들이 있는지
- 최근 실패한 Batch Parameter가 어떤 것들이 있고, 성공한 Job은 어떤 것들이 있는지
- 다시 실행한다면 어디서 부터 시작하면 될지
- 어떤 Job에 어떤 Step들이 있었고, Step들 중 성공한 Step과 실패한 Step들은 어떤 것들이 있는지
- H2의 경우 boot 실행시 자동으로 생성해준다
- MySQL이나 Oracle과 같은 DB 사용시에는 직접 생성해줘야 한다.
- MySQL의 경우 다음과 같다
- 아까 추가한 Spring Batch 라이브러리에 org.springframework.batch.core 폴더에 들어간뒤
org>springframework>batch>core를 보면 schema-mysql.sql파일이 있다. - 이것을 query console을 통해 실행시켜 주면 된다.
- 아까 추가한 Spring Batch 라이브러리에 org.springframework.batch.core 폴더에 들어간뒤
- 이제 정상적으로 Job이 실행된다.
2. Spring batch 작동 확인
1)코드 작성
package com.baechu.batch;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.JobScope;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RequiredArgsConstructor
@Configuration
public class SimpleJobConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job simpleJob(){
return jobBuilderFactory.get("simpleJob")
.start(simpleStep1(null))
.build();
}
@Bean
@JobScope
public Step simpleStep1(@Value("#{jobParameters[needDate]}") String needDate){
return stepBuilderFactory.get("simpleStep1")
.tasklet(((contribution, chunkContext) -> {
log.info(">>>>> This is Step1");
log.info(">>>>> requestDate = {}", needDate);
return RepeatStatus.FINISHED;
}))
.build();
}
}
- 위에서 사용하는 @Value는 lombok꺼를 사용하는 것이 아니다.
- 아래와 같이 beans.factory.annotation을 사용하도록하자.
- 만약 lombok꺼를 사용했다면 작동도 잘 안되고 querydsl과 충돌하여 querydsl을 다시 컴파일 해주어야하는 문제가 발생한다.
- Edit Configurations > Program Argument > needDate=20230401 (현재날자)를 입력하자.
2)작동 확인
- 실행하면 위와 같이 동작 됨을 확인 할 수 있다.
- 그리고 아래와 같이 DB에 들어가면 batch의 job과 step에 대한 실행 이력을 확인 가능하다.
- batch_step_excution도 확인 가능하지만 사진은 패스함
3. 참조
1)Spring batch 기초 설정 : https://devbksheen.tistory.com/284