[스프링배치] JobScope와 StepScope

hoyong.eom·2024년 1월 23일

스프링배치

목록 보기
2/12
post-thumbnail

스프링 배치

스프링배치 강의나 다른 자료들을 보다 보면 JobScope와 StepCope라는 애노테이션을 많이 보게 된다.

JopScope와 StepScope 애노테이션은 어떤 역할을 하는걸까?

@JobScope와 @StepScope

@JobScope@StepScope는 스프링의 기본 Scope인 싱글톤 방식과 대치되는 역할이라고 한다.

Bean의 생성 시점을 스프링 애플리케이션이 실행되는 시점이 아닌 @JobScope, @StepScope가 명시된 메서드가 실행될때 까지 지연시키는것을 말한다. 이러한 행위를 LateBinding이라고 한다.

LateBinding

spring-batch에서는 Late Binding을 통해서 아래와 같은 이점을 얻을 수 있다고 한다.

  • JobParameter를 특정 메서드가 실행하는 시점까지 지연시켜 할당시킬 수 있다.
    따라서 애플리케이션이 구동되는 시점이 아니라 비지니스 로직이 구현된 JobParameter를 할당함으으로 유연한 설꼐가 가능하게 한다?( 이건 아직 이해가 안된다..)
  • 병렬 처리에 안전하다.
    Step의 구성 요소인 ItemReader, ItemProcessor, ItemWriter가 있고, ItemReader에서 데이터를 읽어오는 메서드를 서로 다른 Step으로 부터 동시에 병렬 실행이 된다면 서로 상태를 간섭받게 될 수 있다. 하지만 @StepScope를 적용하면 각각의 Step에 실행될때 서로의 상태를 침범하지 않고 처리를 완료할 수 있다.

@JobScope는 Step 선어문에서만 사용이 가능하고, @StepScope는 Step을 구성하는 ItemReader, ItemProcessor, ItemWriter에서 사용 가능하다.

JobParameter 주의 사항

JobParameter는 @Value 애노테이션을 이용해서 사용할 수 있다. JobParameter는 Step이나 Tasklet, Reader등 배치 컴포넌트 Bean의 생성 시점에 호출할 수 있다. (아래의 코드는 Tasklet이다.) 정확하게 Scope Bean을 생성할때만 가능하다.
즉,@StepScope,@JobScopeBean을 생성할때만JobParameter가 생성되기때문에 사용할 수있다.


    @Bean
    @StepScope
    public Tasklet validatedTasklet(@Value("#{jobParameters['fileName']}" String fileName)) {
        return new Tasklet() {
            @Override
            public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                System.out.println("Validated Param Tasklet ");
                return RepeatStatus.FINISHED;
            }
        }
    }

참고

JobScope와 StepScope

0개의 댓글