스프링 배치 가이드
- 지난 포스팅에서 튜토리얼 보고 따라해봤는데, 이번에는 개념부터 천천히 공부해보자.
- 책을 보고 공부하려 했으나, 스프링과 부트의 배치 사용 문법이 많이 달라 이동욱님의 블로그를 보고 공부했다.
https://devhooney.tistory.com/136
1. JobParameter와 Scope
- 배치 실행 시 외부, 내부에서 파라미터를 받아서 사용할 수 있는데, 이 파라미터를 JobParameter라고 한다.
- JobParameter를 사용하기 위해서는 항상 스프링 배치 전용 Scope를 선언해야 한다.
- 크게 @StepScope, @JobScope가 있다.
- 사용방법
@Value("#{jobParameters[파라미터명]}")
- 예시
@Bean
public Job simpleJob() {
return jobBuilderFactory.get("simpleJob")
.start(simpleStep1(null))
.next(simpleStep2())
.build();
}
@Bean
@JobScope
public Step simpleStep1(@Value("#{jobParameters[requestDate]}") String requestDate) {
return stepBuilderFactory.get("simpleStep1")
.tasklet((contribution, chunkContext) -> {
log.info("Step1!!!!");
log.info("requestDate = {}", requestDate);
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public Step simpleStep2() {
return stepBuilderFactory.get("simpleStep2")
.tasklet(simpleStep2Tasklet(null))
.build();
}
@Bean
@StepScope
public Tasklet simpleStep2Tasklet(@Value("#{jobParameters[requestDate]}") String requestDate) {
return (contribution, chunkContext) -> {
log.info("scopeStep1");
log.info("requestDate = {}", requestDate);
return RepeatStatus.FINISHED;
};
}
- 여기에서는 외부에서 변수를 받고 있다.
- @JobScope는 Step 선언문에서 사용 가능하다.
- @StepScope는 Tasklet이나 ItemReader, ItemWriter, ItemProcessor에서 사용 가능하다.
- Job Parameter의 타입으로 사용할 수 있는 것은 Double, Long, Date, String.
- 예제 코드에서 호출하는 쪽에서 null 를 할당하는데, 이것은 Job Parameter의 할당이 어플리케이션 실행 시에 하지 않기 때문에 가능하다.
2. @StepScope와 @JobScope
- 스프링 배치는 스프링 컨테이너를 통해 지정된 Step의 실행 시점에 해당 컴포넌트를 스프링 빈으로 생성한다.
- @JobScope는 Job의 실행 시점에 빈을 생성한다.
- 즉, Bean의 생성 시점을 지정된 Scope가 실행되는 시점으로 지연시킨다.
- 지연시킴으로 얻는 장점 2가지
- JobParameter의 Late Binding이 가능하다. Job Parameter가 StepContext 또는 JobExecutionContext 레벨에서 할당시킬 수 있다. 꼭 Application이 실행되는 시점이 아니더라도 Controller나 Service와 같은 비지니스 로직 처리 단계에서 Job Parameter를 할당시킬 수 있다. 예제에서 자세히 설명
- 동일한 컴포넌트를 병렬 혹은 동시에 사용할때 유용하다. -> 병렬, 동시 사용 시 더 공부해보려고 한다.
Step 안에 Tasklet이 있고, 이 Tasklet은 멤버 변수와 이 멤버 변수를 변경하는 로직이 있다고 가정한다.
이 경우 @StepScope 없이 Step을 병렬로 실행시키게 되면 서로 다른 Step에서 하나의 Tasklet을 두고 마구잡이로 상태를 변경하려고 한다. 하지만 @StepScope가 있다면 각각의 Step에서 별도의 Tasklet을 생성하고 관리하기 때문에 서로의 상태를 침범할 일이 없게 된다.
- JobParamter는 Step이나, Tasklet, Reader 등 Batch 컴포넌트 Bean의 생성 시점에 호출할 수 있다. 정확히는 Scope Bean을 생성할때만 가능하다.
- 즉, @StepScope, @JobScope Bean을 생성할때만 JobParamter가 생성
- JobParameters를 사용하기 위해선 꼭 @StepScope, @JobScope로 Bean을 생성해야만 한다!!!
'개발 > Java & Kotlin' 카테고리의 다른 글
[Spring] 스프링 배치(Spring Batch) 가이드 따라가기 (5) (0) | 2022.12.18 |
---|---|
[Spring] 스프링 배치(Spring Batch) 가이드 따라가기 (4) (0) | 2022.12.14 |
[Spring] 스프링 배치(Spring Batch) 가이드 따라가기 (2) (0) | 2022.12.11 |
[Spring] 스프링 배치(Spring Batch) 가이드 따라가기 (1) (0) | 2022.12.10 |
[Spring] 스프링 배치(Spring Batch) 맛보기 (1) | 2022.12.06 |