[Spring Batch] @EnableBatchProcessing을 이용하여 스프링 배치 사용하기
1. 스프링 배치를 사용하기 위한 의존성 추가
스프링 배치를 사용하기 위해서는 build.gradle 또는 pom.xml에 스프링 배치에 대한 의존성을 추가해줘야 합니다.
build.gradle
implementation 'org.springframework.boot:spring-boot-starter-batch'
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
2. @EnableBatchProcessing
- @EnableBatchProcessing를 선언을 하면 스프링 배치를 작동시켜줍니다.
- 스프링 배치의 모든 초기화 및 실행을 이루고 총 4개의 설정 클래스를 실행합니다.
- 스프링 부트 배치의 자동 설정 클래스가 실행됨으로 빈으로 등록된 Job을 조회해서 초기화와 동시에 Job를 수행하도록 구성되어있습니다.
@EnableBatchProcessing이 실행시켜주는 4개의 설정 클래스
- BatchAutoConfiguration
- 스프링 배치가 초기화될 때 자동으로 실행되는 설정 클래스
- Job을 수행하는 JobLancherApplication빈을 생성
JobLauncherApplicationRunner은 Job과 JobParameter를 받아서 JobExecution 객체에 넣습니다.
(자세한 설명은 다음에 쓰게 될 포스팅에서 설명드리겠습니다!!)
2. SimpleBatchConfiguration
- JobBuilderFactory와 StepBuilderFactory를 생성할 수 있습니다.
- 스프링 배치의 주요 구성 요소가 생성이 되는데 프록시 객체로 생성이 됩니다.
※참고 : JobBuilderFactory는 빈을 생성하기 위한 빌더 팩토리, StepBuilderFactory는 step를 생성하기 위한 빌더 팩토리입니다.
- BatchConfigurerConfiguration
- BasicBatchConfigurer
- SimpleBatchConfiguration에서 생성한 프록시 객체의 실제 대상 객체를 생성하는 설정 클래스입니다.
- 빈으로 의존성 주입받아서 주요 객체들을 참조해서 사용할 수 있습니다.
- JpaBatchConfigurer
- JPA 관련 객체를 생성하는 설정 클래스입니다.
※참고 : JpaBatchConfigurer은 BasicBatchConfigurer을 상속받습니다.
※ 실행되는 순서
@EnableBatchProcessing -> SimpleBatchConfiguration -> BatchConfigurerConfiguration(BasicBatchConfigurer, JpaBatchConfigurer) -> BatchAutoConfiguration
이제부터 예제를 가지고 하나씩 알아보겠습니다.
우선 저 같은 경우는 스프링 부트를 통해 프로젝트를 만들어서 @EnableBatchProcessing를 @SpringBootApplication이 있는 곳에 선언해주었습니다.
@SpringBootApplication
@EnableBatchProcessing
public class BatchApplication {
public static void main(String[] args) {
SpringApplication.run(BatchApplication.class, args);
}
}
- @EnableBatchProcessing를 선언해줌으로써 Spring Batch를 사용할 수 있게 되었습니다.
@Configuration
@RequiredArgsConstructor
public class JobConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job jobTest() {
return jobBuilderFactory.get("jobName")
.start(stepTest1())
.next(stepTest2())
.build();
}
@Bean
public Step stepTest1() {
return stepBuilderFactory.get("stepName1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("========================");
System.out.println("stepName1");
System.out.println("========================");
return RepeatStatus.FINISHED;
}
}).build();
}
@Bean
public Step stepTest2() {
return stepBuilderFactory.get("stepName2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("========================");
System.out.println("stepName2");
System.out.println("========================");
return RepeatStatus.FINISHED;
}
}).build();
}
}
- Job과 Step를 @Bean 선언을 하여 빈으로 등록해줍니다.
- JobBuilderFactory : Job을 생성하기 위한 빌더 팩토리
- StepBuilderFactory : Step을 생성하기 위한 빌더 팩토리
위에 있는 코드를 나눠서 설명하겠습니다.
@Bean
public Job jobTest() {
return jobBuilderFactory.get("jobName")
.start(stepTest1())
.next(stepTest2())
.build();
}
- jobBuilderFactory.get(인자) : get 메서드 내에 "인자"에 대한 내용은 Job에 대한 이름을 넣어주시면 됩니다.
- start : 첫 번째로 수행할 step 메서드를 수행합니다.
- next : 다음으로 수행할 step 메서드를 수행합니다.
@Bean
public Step stepTest1() {
return stepBuilderFactory.get("stepName1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("========================");
System.out.println("stepName1");
System.out.println("========================");
return RepeatStatus.FINISHED;
}
}).build();
}
@Bean
public Step stepTest2() {
return stepBuilderFactory.get("stepName2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("========================");
System.out.println("stepName2");
System.out.println("========================");
return RepeatStatus.FINISHED;
}
}).build();
}
- stepBuilderFactory.get("인자") : get메서드 내에 "인자"는 Step에 대한 이름을 적어주시면 됩니다.
- tasklet : tasklet이 해당하는 Step 안에서 단일 태스크로 수행되는 로직을 구현합니다.
- RepeatStatus : tasklet을 한번 수행하고 멈출 것인지 계속 수행할 것인지에 대한 설정입니다. 설정에는 FINISHED와 CONTINUABLE가 있습니다.
- RepeatStatus.FINISHED : tasklet이 한번 수행하면 끝
- RepeatStatus.CONTINUABLE : 계속적으로 수행
- return null : RepeatStatus.FINISHED과 같은 결과
※ 실행되는 순서
Job을 구동 시킴 -> Job내에 start, next 등으로 설정한 step 실행 -> step 내에 있는 tasklet 실행
참고한 강의
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98
'Spring Boot > Batch' 카테고리의 다른 글
[Spring Batch] Job, JobInstance, JobParameter, JobExecution 에 대하여 (0) | 2022.10.09 |
---|