본문 바로가기
개발/Spring

[Spring] 스프링 배치(Spring Batch) 가이드 따라가기 (3)

by devhooney 2022. 12. 13.
728x90

스프링 배치 가이드

 

- 지난 포스팅에서 튜토리얼 보고 따라해봤는데, 이번에는 개념부터 천천히 공부해보자.

- 책을 보고 공부하려 했으나, 스프링과 부트의 배치 사용 문법이 많이 달라 이동욱님의 블로그를 보고 공부했다.

https://devhooney.tistory.com/136

 

[Spring] 스프링 배치(Spring Batch) 가이드 따라가기 (2)

스프링 배치 가이드 - 지난 포스팅에서 튜토리얼 보고 따라해봤는데, 이번에는 개념부터 천천히 공부해보자. - 책을 보고 공부하려 했으나, 스프링과 부트의 배치 사용 문법이 많이 달라 이동욱

devhooney.tistory.com

 

 

728x90

 

 

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가지

  1. JobParameter의 Late Binding이 가능하다. Job Parameter가 StepContext 또는 JobExecutionContext 레벨에서 할당시킬 수 있다. 꼭 Application이 실행되는 시점이 아니더라도 Controller나 Service와 같은 비지니스 로직 처리 단계에서 Job Parameter를 할당시킬 수 있다. 예제에서 자세히 설명
  2. 동일한 컴포넌트를 병렬 혹은 동시에 사용할때 유용하다. -> 병렬, 동시 사용 시 더 공부해보려고 한다.

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을 생성해야만 한다!!!

 

728x90