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개의 설정 클래스

  1. BatchAutoConfiguration
  • 스프링 배치가 초기화될 때 자동으로 실행되는 설정 클래스
  • Job을 수행하는 JobLancherApplication빈을 생성

JobLauncherApplicationRunner은 Job과 JobParameter를 받아서 JobExecution 객체에 넣습니다.

(자세한 설명은 다음에 쓰게 될 포스팅에서 설명드리겠습니다!!)

 

2. SimpleBatchConfiguration

  • JobBuilderFactory와 StepBuilderFactory를 생성할 수 있습니다.
  • 스프링 배치의 주요 구성 요소가 생성이 되는데 프록시 객체로 생성이 됩니다.

※참고 : JobBuilderFactory는 빈을 생성하기 위한 빌더 팩토리, StepBuilderFactory는 step를 생성하기 위한 빌더 팩토리입니다.

 

  1. 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