기본적인 셋팅은 이동욱님의 블로그에 상세하게 나와 있기 때문에, 사용방법 위주의 내용만 간추리겠다.
최하단의 링크를 참고하시면 됩니다.
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)
'SPRING > 기본 상식' 카테고리의 다른 글
[SPRING] Eureka란? (0) | 2021.05.25 |
---|---|
[SPRING] Spring Cloud란? (0) | 2021.05.25 |
[SPRING] 웹 스코프 (0) | 2021.04.28 |
[SPRING] 빈 스코프 (싱글 스코프, 프로토타입 스코프) (0) | 2021.04.28 |
[SPRING] 조회 빈이 2개 이상 일 때 해결 방법 (0) | 2021.04.27 |