spring initializr에서 Spring Boot 프로젝트를 먼저 생성한다.
우선 회사의 현재 환경에 맞춰서 생성해야 하므로
로 프로젝트를 생성해보자.
프로젝트의 압축을 풀어서 intellij로 열었다.
@EnableBatchProcessing //배치 활성화
@SpringBootApplication
public class CreshBatchApplication {
public static void main(String[] args) {
SpringApplication.run(CreshBatchApplication.class, args);
}
}
@EnableBatchProcessing
어노테이션을 적용하여 Spring Batch 프로그램을 활성화 한다.
@Slf4j
@RequiredArgsConstructor
@Configuration //Spring에 설정 파일이라는 선언
public class TestJob {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job simpleJob() {
return jobBuilderFactory.get("simpleJob") //(1) simpleJob 이름으로 batch job을 생성
.start(simpleStep1()) //(2) simpleStep1 method Step을 실행
.build();
}
@Bean
public Step simpleStep1() {
return stepBuilderFactory.get("simpleStep1") //(3) simpleStep1 batch step을 생성
.tasklet((contribution, chunkContext) -> { //(4) step 안에서 수행될 기능들을 명시, tasklet은 step 안에서 단일로 수행될 커스텀한 기능을 선언할 때 사용
log.info(contribution.toString());
log.info(chunkContext.toString());
log.info(">>>>> This is Step1");
return RepeatStatus.FINISHED; //(5) batch가 성공적으로 수행되고 종료됨을 반환
})
.build();
}
}
프로젝트에 jobs 패키지를 만들어 TestJob.class를 만들고 다음과 같은 코드를 작성해서 결과 값을 봐보자.
- simpleJob이란 이름으로 batch job을 생성한다.
- Step으로 정의된 simpleStep1을 실행시킨다.
- simpleStep1이란 이름으로 batch step을 생성한다.
- tasklet으로 step 안에서 수행될 기능들을 명시해놓음
- tasklet은 step 안에서 단일로 수행될 커스텀한 기능을 선언할 때 사용된다.
- tasklet 외에는 reader, processor, writer의 묶음으로 실행하는 방법이 있다.
- batch가 성공적으로 수행되고 종료됨을 반환한다.
실행된 로그를 봐보면
- Job에 simpleJob이란 이름으로 job이 등록
- simtepStep1을 excute
- This is Step1 출력
- impleStep1의 실행 시간 출력
- 실행된 Job이 정상실행되었고 실행된 Job에 대한 정보 출력
으로 종료되었음을 알수 있다.
이미지 출처 : https://juneyr.dev/2019-07-24/spring-batch-tasklet
tasklet과 {reader, processor, writer}의 묶음을 비교하면 tasklet은 한번에 모두 처리가 끝난다고 생각하면 될거 같고 묶음은 읽고, 로직 진행, 쓰기로 나눠서 작업한다고 생각하면 될거 같다. 그리고 중요한 것은 두개의 방법 중 step을 작성할땐 한가지 방법으로만 작성해야한다는 점이다.
참고글
향로님 batch 가이드 최고
스프링 배치 튜토리얼
h2 세팅과 파일작성
batch+Scheduler 구현