본문으로 바로가기

기본적인 셋팅은 이동욱님의 블로그에 상세하게 나와 있기 때문에, 사용방법 위주의 내용만 간추리겠다.

최하단의 링크를 참고하시면 됩니다.

 

1-1. Simple Job 생성하기

Batch Job을 만들기 전에, BatchApplication.java에 다음과 같이 Spring Batch 기능 활성화 어노테이션 (@EnableBatchProcessing)을 추가합니다.

이 어노테이션을 선언하면, Spring Batch의 여러 기능들을 사용할 수 있게 됩니다.
선언하지 않으시면 Spring Batch 기능을 사용할 수 없기 때문에 필수로 선언하셔야만 합니다.

설정이 끝나셨으면 패키지 아래에 job 패키지를 생성하고, SimpleJobConfiguration.java 파일을 생성합니다.

생성한 Java 파일 안에 simpleJob 이란 이름의 간단한 Spring Batch 코드를 작성해봅니다.

 

예시1)

@Slf4j // log 사용을 위한 lombok 어노테이션
@RequiredArgsConstructor // 생성자 DI를 위한 lombok 어노테이션
@Configuration
public class SimpleJobConfiguration {
    private final JobBuilderFactory jobBuilderFactory; // 생성자 DI 받음
    private final StepBuilderFactory stepBuilderFactory; // 생성자 DI 받음

    @Bean
    public Job simpleJob() {
        return jobBuilderFactory.get("simpleJob")
                .start(simpleStep1())
                .build();
    }

    @Bean
    public Step simpleStep1() {
        return stepBuilderFactory.get("simpleStep1")
                .tasklet((contribution, chunkContext) -> {
                    log.info(">>>>> This is Step1");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
}
  • @Configuration
    • Spring Batch의 모든 Job은 @Configuration으로 등록해서 사용합니다.
  • jobBuilderFactory.get("simpleJob")
    • simpleJob 이란 이름의 Batch Job을 생성합니다.
    • job의 이름은 별도로 지정하지 않고, 이렇게 Builder를 통해 지정합니다.
  • stepBuilderFactory.get("simpleStep1")
    • simpleStep1 이란 이름의 Batch Step을 생성합니다.
    • jobBuilderFactory.get("simpleJob")와 마찬가지로 Builder를 통해 이름을 지정합니다.
  • .tasklet((contribution, chunkContext))
    • Step 안에서 수행될 기능들을 명시합니다.
    • Tasklet은 Step안에서 단일로 수행될 커스텀한 기능들을 선언할때 사용합니다.
    • 여기서는 Batch가 수행되면 log.info(">>>>> This is Step1") 가 출력되도록 합니다.

Batch Job을 생성하는 simpleJob 코드를 보시면 simpleStep1을 품고 있음을 알 수 있습니다.
Spring Batch에서 Job은 하나의 배치 작업 단위를 얘기하는데요.
Job 안에는 아래처럼 여러 Step이 존재하고, Step 안에 Tasklet 혹은 Reader & Processor & Writer 묶음이 존재합니다.

Job안에 여러 Step이 있다는건 쉽게 이해되지만, Step이 품고 있는 단위가 애매하게 보이실 수 있습니다.

Tasklet 하나와 Reader & Processor & Writer 한 묶음이 같은 레벨입니다.
그래서 Reader & Processor가 끝나고 Tasklet으로 마무리 짓는 등으로 만들순 없다는걸 꼭 명심해주셔야 합니다.

Tasklet은 어찌보면 Spring MVC의 @Component, @Bean과 비슷한 역할이라고 보셔도 될 것 같습니다.
명확한 역할은 없지만, 개발자가 지정한 커스텀한 기능을 위한 단위로 보시면 됩니다.

자 그럼 한번 이 간단한 Spring Batch 어플리케이션을 실행해보겠습니다.
처음 만들어졌던 BatchApplication.java의 main 메소드를 실행하면 Batch가 실행됩니다.

 

실행해보시면 아래처럼 log.info(">>>>> This is Step1")가 잘 수행되어 로그가 찍힌것을 알 수 있습니다.

 

※ @JobScope를 잊으시면 안됩니다.
Batch Job Parameter는 이후 챕터에서 좀 더 자세히 소개드리겠습니다.
지금은 메타 테이블에 대한 이해를 위한 샘플 코드이니 '이렇게 하면 Job Parameter를 사용할 수 있다 정도로만' 이해하시면 됩니다. :)
변경된 코드는 Job Parameter로 받은 값을 로그에 추가로 출력시키는 기능입니다.
자 그럼 이제 Job Parameter를 넣어서 Batch 를 실행해보겠습니다.

예시) 시간 블로그에는 날짜로 확인 (requestDate=20180806)

@Slf4j // log 사용을 위한 lombok 어노테이션
@RequiredArgsConstructor // 생성자 DI를 위한 lombok 어노테이션
@Configuration
public class SimpleJobConfiguration {
    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job simpleJob() {
        return jobBuilderFactory.get("simpleJob")
                .start(simpleStep1(null))
                .next(simpleStep2(null))
                .build();
    }

    @Bean
    @JobScope
    public Step simpleStep1(@Value("#{jobParameters[requestDate]}") String requestDate) {
        return stepBuilderFactory.get("simpleStep1")
                .tasklet((contribution, chunkContext) -> {
                    throw new IllegalArgumentException("step1에서 실패합니다.");
                })
                .build();
    }

    @Bean
    @JobScope
    public Step simpleStep2(@Value("#{jobParameters[requestDate]}") String requestDate) {
        return stepBuilderFactory.get("simpleStep2")
                .tasklet((contribution, chunkContext) -> {
                    log.info(">>>>> This is Step2");
                    log.info(">>>>> requestDate = {}", requestDate);
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
}

 

 

참조사이트 : 이동욱님의 블로그 (https://jojoldu.tistory.com/325?category=902551)