본문 바로가기
error/Backend

Spring boot 3.1.0에서 기본적인 SpringBatch 설정하기

by 이쟝 2023. 6. 20.
Batch를 공부하기 위해서 강의를 보고 공부하던 중에, 강의는 2.7.3 버전으로 Spring Batch를 구현하고 있었는데, 나는 기본적으로 인텔리제이 안에서 프로젝트를 만들었어서 3.1.0 버전으로 됐었다. 근데.. 기존 Spring batch에서 쓰던 StepBuilderFactory와 JobBuilderFactory가 deprecated되었다고 하고,, get메서드도 오류가 나서 한 참 구글링해보고, 유튜브도 참고하면서.. 오류를 고쳤다...!

기본 2.7.3에서 쓰던 코드

1. 기본이 되는 Application 코드

@EnableBatchProcessing
@SpringBootApplication
public class BatchApplication {

	// job을 만들기 위해서 step을 만들어야 함
	private final JobBuilderFactory jobBuilderFactory; // job을 만들어줄 수 있는 builder

	private final StepBuilderFactory stepBuilderFactory; // step을 만들어줄 수 있는 builder

	public BatchApplication(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
		this.jobBuilderFactory = jobBuilderFactory;
		this.stepBuilderFactory = stepBuilderFactory;
	}

	// Step 선언
	@Bean
	public Step passStep() {
		return this.stepBuilderFactory.get("passStep")
				.tasklet((contribution, chunkContext) -> {
					System.out.println("Execute PassStep");
					return RepeatStatus.FINISHED;
				}).build();
	}

	// Job선언
	@Bean
	public Job passJob() {
		return this.jobBuilderFactory.get("passJob")
				.start(passStep())
				.build();
	}
	public static void main(String[] args) {
		SpringApplication.run(BatchApplication.class, args);
	}

}

2. application.yml 및 build.gradle

spring:
  datasource:
    url: jdbc:h2:mem:mydb
    username: pass_local
    password: passlocal123
    driver-class-name: org.h2.Driver

  • StepBuilderFactory와 JobBuilderFactory가 deprecated되었고, get 메서드를 사용할 수 없다. 

변경한 코드

@SpringBootApplication
public class BatchApplication {

	@Bean
	public Step passStep(JobRepository jobRepository, PlatformTransactionManager platformTransactionManager) {
		return new StepBuilder("passStep", jobRepository)
				.tasklet((contribution, chunkContext) -> {
					System.out.println("Execute passStep");
					return RepeatStatus.FINISHED;
				}, platformTransactionManager).build();
	}

	// Job선언
	@Bean
	public Job passJob(JobRepository jobRepository, Step passStep) {
		return new JobBuilder("passJob", jobRepository)
				.start(passStep)
				.build();
	}

	public static void main(String[] args) {
		SpringApplication.run(BatchApplication.class, args);
	}

}

 

  • 공식문서를 참고해서 코드를 변경했다. JobBuilderFactory와 StepBuilderFactory를 쓰지 않고, JobBuilder와 StepBuilder를 사용합니다.
  • Step은 JobRepository와 PlatformTransactionManager하고, Job은 JobRepository와 그 위에서 정의한 Step 메서드를 사용합니다. 
  • EnableBatchProcessing 어노테이션을 제거합니다. 

결론

=> sout에 적었던 Execute passStep이 잘 나오게 된다..!

=> 일단 Batch를 사용하기 위한 기초공사는 끝났다..!


Q. 왜 EnableBatchProcessing 어노테이션을 주석처리하면 오류없이 잘 처리되는 걸까.

@EnableBatchProcessing // 스프링부트 배치 스타터에 미리 정의된 설정들을 실행시키는 어노테이션으로 JobBuilder, StepBuilder 등 다양한 설정 주입

=> 스프링부트 3.0부터는 EnableBatchProcessing 어노테이션이 필요하지 않다고 한다. 


참고

https://www.youtube.com/watch?v=_TSjkSn2yvQ

https://docs.spring.io/spring-batch/docs/current/api/org/springframework/batch/core/configuration/annotation/JobBuilderFactory.html

https://mindasom.tistory.com/168