Batch Scope와 Job Parameter

최준호·2022년 1월 17일
0

Spring Batch

목록 보기
4/10

Scope와 Job Parameter

Batch의 Scope는 @StepScope, @JobScope가 있고 요청에 대한 파라미터를 받을 수 있는 Job Parameter에 대해 공부해보자.

Job Parameter

Batch는 외부 혹은 내부에서 파라미터를 받아 여러 Batch 컴포넌트에서 사용할 수 있게 지원하고 있다. 하지만 JobParameter를 사용하기 위해서는 Batch 전용 Scope를 선언해야 하는데. 크게 @StepScope, @JobScope 2개가 있다.

@Bean
@JobScope
public Step simpleStep1(@Value("#{jobParameters[requestDate]}") String requestDate) {
    return stepBuilderFactory.get("simpleStep1")        //simpleStep1 batch step을 생성
            .tasklet((contribution, chunkContext) -> {  //step 안에서 수행될 기능들을 명시, tasklet은 step 안에서 단일로 수행될 커스텀한 기능을 선언할 때 사용
                log.info(">>>>> This is Step1");
                log.info(">>>>> requestDate = {}",requestDate);
                return RepeatStatus.FINISHED;           //batch가 성공적으로 수행되고 종료됨을 반환
            })
            .build();
}

사용밥법은 다음과 같이 Scope를 선언해주고 @Value()안에 SpEL로 작성해주면 된다.

SpEL Spring 표현언어로 Spring 내에서 사용하는 문법이다.

@StepScope와 @JobScope

Batch는 @StepScope@JobScope라는 Bean Scope를 지원한다. 이 Bean Scope를 보기 전 Spring의 기본 Scope는 singleton인데 위 두 Scope를 사용하게되면 Batch가 Spring 컨테이너를 통해 지정된 Step의 실행시점에 해당 컴포넌트를 Spring Bean으로 생성해준다.

@StepScope와 @JobScope는 Job이 실행되고 종료될 때 생성/삭제가 이루어진다.

이렇게 Bean의 생성 시점을 Step 혹은 Job의 실행시점으로 지연시키면서 얻는 장점은 2가지가 있다.

  1. JobParamter의 Late Binding
    JobParameter가 StepContext 또는 JobExcutionContext 레벨에서 할당 시킬 수 있다. 무조건 어플리케이션이 실행되는 시점이 아닌 비지니스 로직 처리 단계에서 Job Parameter를 할당시킬 수 있다.

  2. 동일한 콤포넌트를 병렬 혹은 동시에 사용해야할 경우
    Step 안에 Tasklet이 있고, 이 Tasklet은 멤버 변수와 이 멤버 변수를 변경하는 로직이 있을 때 StepScope가 있다면 각 Step에 별도의 Tasklet을 생성하고 관리하기 때문에 각자의 상태를 침범하지 않는다.

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글