본문 바로가기
Practice/SpringBatch

Day 4. Spring Batch Scope

반응형

Spring-Batch의 기본 개념을 정리하고, 간단한 실습 환경부터 연습해보는 포스팅입니다

참고

Spring-Batch 공식문서(4.3.3 기준)

https://docs.spring.io/spring-batch/docs/4.3.3/reference/html/

 

Spring Batch - Reference Documentation

Welcome to the Spring Batch reference documentation! This documentation is also available as single html and pdf documents. The reference documentation is divided into several sections: The following appendices are available: Lucas Ward, Dave Syer, Thomas

docs.spring.io

 

 

이동욱님의 블로그

https://jojoldu.tistory.com/324?category=902551 

 

1. Spring Batch 가이드 - 배치 어플리케이션이란?

Spring Batch In Action이 2011년 이후 개정판이 나오지도 않고 (2019.03 기준), 한글 번역판도 없고, 국내 Spring Batch 글 대부분이 튜토리얼이거나 공식 문서 중 일부분을 짧게 번역한 내용들이라 대용량 시

jojoldu.tistory.com


1. JobParameters 와 Scope

  • JobParameter란?
    • SpringBatch의 외부 혹은 내부에서 파라미터를 받아 여러 Component에서 사용할 수 있게 지원하는데 이 파라미터를 JobParameter라고 합니다
    • JobParameter를 사용하기위해서는 항상 전용 Scope를 설정해줘야합니다
      • JobScope
        • 하나의 Job 범위안에서 사용
        • Step 정의문에 사용 가능
      • StepScope
        • 하나의  Step 범위안에서 사용
        • Tasklet, ItemReader, ItemProcessor, ItemWriter 정의문에서 사용 가능
    • JobParameter로 사용 가능한 타입
      • Double
      • Long
      • Date
      • String
      • 아직까지 LocalDateTime, LocalDate를 지원하지 않아 String으로 받아서 변환해야합니다
    • 사용법
      @Value("#{jobParameters[파라미터]}")​
      • org.springframework.beans.factory.annotation.Value
      • lombok @Value 어노테이션 아닙니당
      • JobParameter는 클래스(@Component), 메서드(@Bean) 어느 것으로 생성해도 무관하나 반드시 @JobScope, @StepScope Bean으로 선언했을때만 사용이 가능합니다
    • 예제 코드
      // Scope
      
      @Slf4j
      @RequiredArgsConstructor
      @Configuration
      public class ScopeJobConfiguration {
      
          private final JobBuilderFactory jobBuilderFactory;
          private final StepBuilderFactory stepBuilderFactory;
      
      
          @Bean
          public Job scopeJob() {
              return jobBuilderFactory.get("scopeJob")
                                      .start(scopeStep1(null))
                                      .next(scopeStep2())
                                      .build();
          }
      
          @Bean
          @JobScope
          public Step scopeStep1(@Value("#{jobParameters[requestDate]}") String requestDate) {
              return stepBuilderFactory.get("scopeStep1")
                                       .tasklet((contribution, chunkContext) -> {
                                          log.info(">>>>>>>> scopeStep1");
                                          log.info("requestDate={}", requestDate);
                                          return RepeatStatus.FINISHED;
                                       })
                                       .build();
          }
      
          @Bean
          public Step scopeStep2() {
              return stepBuilderFactory.get("scopeStep2")
                                       .tasklet(scopeStep2Tasklet(null))
                                       .build();
          }
      
          @Bean
          @StepScope
          public Tasklet scopeStep2Tasklet(@Value("#{jobParameters[requestDate]}") String requestDate) {
              return (contribution, chunkContext) -> {
                  log.info(">>>>>>>> scopeStep2");
                  log.info("requestDate={}", requestDate);
                  return RepeatStatus.FINISHED;
              };
          }
      
      }​

 

2.  @JobScope와 @StepScope

  • JobParameter의 할당 시점은 호출 시점입니다
    • 어플리케이션 실행 시점이 아니기 때문에 위 예제 코드에서 보이는 것처럼 null 값을 할당할 수 있습니다
  • @StepScope를 통해 Scope를 지정하면 Spring Batch가 Spring 컨테이너를 통해 지정된 Step 실행시점에 해당 컴포넌트를 Spring Bean(기본 Singleton)으로 생성합니다
  • 같은 방식으로 @JobScope를 사용하면 Job 실행시점에 해당 컴포넌트를 Spring Bean으로 생성합니다
  • 두 개의 Scope 어노테이션은 Bean의 생성 시점을 지정된 Scope가 실행되는 시점까지 지연시킵니다
    • JobParameter의 Late Binding이 가능합니다
      • 꼭 Application이 실행되는 시점이 아니더라도 Controller나 Service와 같은 비지니스 로직 처리 단계에서 Job Parameter를 할당 가능
    • 동일한 컴포넌트를 병렬 혹은 동시에 사용할 때 유용합니다
      • @StepScope가 있다면 각각의 Step에서 별도의 Tasklet을 생성하고 관리가 되기 때문에 서로 침범할 일이 없다
      • 마찬가지로 @JobScope도 같은 개념

 

3.  SpringBatch에서 JobParameter를 사용해야하는 이유

  • CommandLineRunner(Program arguments)를 이용할꺼면 기존의 시스템 변수(application.yml, -D 파라미터)를 이용하면 되지 않을까? 란 의문이 생길 수 있습니다
  • 시스템 변수를 사용하면 SpringBatch의 JobParameter 관련 기능을 사용하지 못합니다
    • 같은 Job에 대해 똑같은 JobParameter로 중복 실행을 하지 않음
    • JobParameter을 관리하는 여러 SpringBatch 메타테이블 활용하지 못함
  • CommandLine으로만 실행을 해야하기 때문에 동시에 여러 Job을 실행하려는 경우 또는 테스트 코드로 Job을 실행해야할때 문제가 발생할 수 있습니다
    • 하지만 Job Parameter를 사용하면 각각의 Batch 컴포넌트들이 사용하면 되니 변경이 심한 경우에도 쉽게 대응할 수 있습니다

 

728x90
반응형

'Practice > SpringBatch' 카테고리의 다른 글

Day 5. Spring Batch Chunk  (0) 2021.10.07
Day 3. Spring Batch Job 흐름 정의  (0) 2021.09.05
Day 2. SpringBatch Job 메타 테이블이란?  (0) 2021.09.04
Day 1. Spring-Batch 환경 설정  (0) 2021.09.01