[Spring] Spring Batch @JobScope와 @StepScope

김강욱·2024년 5월 12일
0

Spring

목록 보기
8/17
post-thumbnail

이번 포스팅에서는 스프링 배치에서 사용되는 어노테이션인 @JobScope@StepScope에 대해 알아보도록 하겠습니다.

✈️ @JobScope/@StepScope란?

@JobScope@StepScope는 스프링 배치에서 빈의 생명주기를 배치 작업의 특정 구성 요소에 맞추어 관리하는데 사용되고 있습니다.

@JobScope

@JobScope는 스프링 배치 잡(Job)의 실행 동안에만 존재하는 빈을 정의할 때 사용됩니다. 그래서 배치 잡(Job)이 시작될 때 빈이 생성되고 잡(Job)이 완료되면 소멸하게 됩니다.

@JobScope를 사용하여 잡(Job)의 실행과 관련된 상태를 저장하고 관리할 수 있습니다. 예를 들어, 잡(Job)의 실행 상태를 저장하는 빈을 @JobScope로 정의할 수 있습니다.

@StepScope

@StepScope는 스프링 배치 스텝(Step)의 실행 동안에만 존재하는 빈을 정의할 때 사용됩니다. 그래서 배치 스텝(Step)이 실행될 때 빈이 생성되고 스텝(Step)이 완료되면 소멸됩니다.

@StepScope를 사용하여 스텝(Step)별로 필요한 데이터나 상태를 관리할 수 있습니다. 예를 들어, 각 스텝(Step)에서 사용될 데이터 모델이나 프로세서를 @StepScope로 정의할 수 있습니다.

@JobScope@StepScope는 스프링의 기본 Scope인 싱글톤 방식과는 대치됩니다.

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

✏️ Late Binding의 이점

1. 지연 할당 가능

JobParameter를 특정 메서드가 실행하는 시점까지 지연시켜 할당시킬 수 있습니다.

즉, 애플리케이션이 구동되는 시점이 아니라 잡(Job)이나 스텝(Step)이 실제로 실행될 때 JobParameter를 전달하고 받아오도록 할 수 있기 때문에 유연한 설계를 가능하게 합니다.

2. 병렬 처리에 안전

스탭(Step)의 구성요소인 ItemReader, ItemProcessor, ItemWriter가 있고, ItemReader에서 데이터를 읽어오는 메서드를 서로 다른 Step으로부터 동시에 병렬 실행이 된다면 서로 상태를 간섭 받게 될 수 있습니다. 하지만 @StepScope를 적용하면 각각의 Step이 실행될 때 서로의 상태를 방해하지 않고 독립적으로 동작할 수 있도록 해줍니다.

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

예시 코드

 // JobScope 설정
 @Bean
 @JobScope
 public Step inactiveJobStep(@Value("#{jobParameters[requestDate]}") final String requestDate) {
       log.info("requestDate: {}", requestDate);
       return stepBuilderFactory.get("inactiveUserStep")
               .<User, User>chunk(10)
               .reader(inactiveUserReader())
               .processor(inactiveUserProcessor())
               .writer(inactiveUserWriter())
               .build();
 }

// StepScope 설정
   @Bean
    @StepScope
    public ItemReader<GpsRequestDto> itemReader(@Value("#{jobParameters[dataIdentifier]}") String dataIdentifier) throws JsonProcessingException {
        // dataIdentifier를 사용하여 실제 데이터 로딩
        List<GpsRequestDto> inputData = loadDataByIdentifier(dataIdentifier);
        return new ListItemReader<>(inputData);
    }

@StepScope 또는 @JobScope 어노테이션을 가진 빈(예: Step, Tasklet, Reader 등)이 생성될 때만 JobParameters를 사용할 수 있습니다.

JobParameters는 배치 잡의 각 실행 때마다 다를 수 있는 파라미터들을 의미합니다. 이러한 파라미터들은 배치 컴포넌트가 실행될 때 필요한 정보를 제공합니다.


참고 자료
sa1341님의 velog

profile
TO BE DEVELOPER

0개의 댓글

관련 채용 정보