from Dictionary - SpringBatch

SpringBatch

  • JobLauncher : Job을 실행 시키는 컴포넌트
  • JobRepository: Job실행, Job, Step을 저장
  • Job : 하나의 배치 실행 단위, 1개 이상의 Step으로 구성됨
  • JobInstance :논리적인 Job 실행을 의미합니다. 주로 Job 에 파라미터를 부여하여 다른 JobInstance 구분할수 있습니다.
  • Step : 일련의 작업들
  • ItemReader : Step에서 데이터를 읽는 Tasklet
  • ItemProcessor: ItemReader에서 읽은 데이터를 처리하는 Tasklet
  • ItemWriter : ItemProcessor로 처리된 데이터를 쓰는 Tasklet

@JobScope와 @StepScope

Scope란?

  • 스프링 컨테이너에서 빈이 관리되는 범위
  • singleton, prototype, request, session, application이 있으며 기본은 singleton으로 생성된다.
  • Job과 Step의 빈 생성과 실행에 관여하는 스코프
  • 프록시 모드를 기본 값으로 하는 스코프: @Scope(value = "job", proxyMode = ScopedProxyMode.TARGET_CLASS)
  • @JobScope@StepScope가 선언되면 빈의 생성이 애플리케이션 구동 시점이 아닌 빈의 실행 시점에 이루어진다.
  • @Values를 주입해서 빈의 실행 시점에 값을 참조할 수 있으며 일종의 Lazy Binding이 가능해진다.
  • @Value(”#{jobParameters[파라미터명]}”), @Value(”#{jobExecutionContext[파라미터명]”}), @Value(”#{stepExecutionContext[파라미터명]”})
  • @Value를 사용할 경우 빈 선언문에 @JobScope, @StepScope를 정의하지 않으면 오류를 발생한다. 때문에 반드시 선언해야 한다.
  • 프록시 모드로 빈이 선언되기 때문에 애플리케이션 구동 시점에는 빈의 프록시 객체가 생성되어 실행 시점에 실제 빈을 호출 해준다.
  • 병렬 처리 시 각 쓰레드마다 생성된 스코프 빈이 할당 되기 때문에 쓰레드에 안전하게 실행이 가능하다.

@Configuration
@Slf4j
@RequiredArgsConstructor
public class BatchExample {
    private final PlatformTransactionManager txManager;


    @Bean(name = "exampleJob")
    public Job exampleJob(@Qualifier(value = "exampleStep") Step step, JobRepository jobRepository) {
        return new JobBuilder("exampleJob", jobRepository).start(step).build();
    }


    @JobScope
    @Bean(name = "exampleStep") //작업으로 STep 명시
    public Step exampleStep(@Qualifier(value = "exampleTasklet") Tasklet tasklet, JobRepository jobRepository) {
        return new StepBuilder("exampleStep", jobRepository).tasklet(tasklet, txManager).build();
    }


    @StepScope
    @Bean(name = "exampleTasklet")
    public Tasklet exampleTasklet (){  // 간단한 작업 명세
        return (contribution, chunkContext) -> {
            log.info("ExampleTasklet");
            return RepeatStatus.CONTINUABLE;
        };
    }
}

Spring Batch 5

  1. @EnableBatchProcessing로 Batch를 initialize 할 수 없어졌음 -> 5부터 autoConfigure 날아감
  2. JobBuilderFactory / StepBuilderFactory -> JobBuilder/ StepBuilder로 변경됨

참고