반응형
Spring-Batch의 기본 개념을 정리하고, 간단한 실습 환경부터 연습해보는 포스팅입니다
참고
Spring-Batch 공식문서(4.3.3 기준)
https://docs.spring.io/spring-batch/docs/4.3.3/reference/html/
이동욱님의 블로그
https://jojoldu.tistory.com/324?category=902551
1. JobParameters 와 Scope
- JobParameter란?
- SpringBatch의 외부 혹은 내부에서 파라미터를 받아 여러 Component에서 사용할 수 있게 지원하는데 이 파라미터를 JobParameter라고 합니다
- JobParameter를 사용하기위해서는 항상 전용 Scope를 설정해줘야합니다
- JobScope
- 하나의 Job 범위안에서 사용
- Step 정의문에 사용 가능
- StepScope
- 하나의 Step 범위안에서 사용
- Tasklet, ItemReader, ItemProcessor, ItemWriter 정의문에서 사용 가능
- JobScope
- 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도 같은 개념
- JobParameter의 Late Binding이 가능합니다
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 |