이번 시간에는 간단한 Spring Batch Job을 생성 & 실행 해보도록 한다.
- IntelliJ
- Spring Boot 2.1.7
- Java 11
- Gradle
인텔리제이에서 새로운 프로젝트 생성한다.
(Gradle -> Java)
build.gradle 설정하기
build.gradle
buildscript {
ext{
springBootVersion ='2.1.7.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group='com.jojoldu.spring'
version='1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-batch'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2'
runtimeOnly 'mysql:mysql-connector-java'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok:1.18.10'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.batch:spring-batch-test'
}
main->java에서 패키지를 생성한다.
생성한 패키지 밑에 클래스의 이름이 Application인 Java class를 생성한다.
생성한 클래스에 아래 코드를 작성한다.
Applicaion
package com.jojoldu.book.springBatch;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args){
SpringApplication.run(Application.class,args);
}
}
위의 작업은 https://start.spring.io/ 에서 간단하게 설정할 수 있다.
이제 spring boot설정이 끝났다. 아래부터는 간단한 Spring Batch Job을 생성하려 한다.
Batch job을 생성하기 전에, Application.java에 다음과 같이 Spring Batch기능 활성화 어노테이션(@EnableBatchProcessing)을 추가한다.
이 어노테이션을 선언하면 Spring Batch의 여러 기능을 사용할 수 있다.
패키지 아래에 job 패키지를 생성하고, SimpleJobConfig.java를 생성한다.
SimpleJobConfig
@Slf4j //log 사용을 위한 lombok 어노테이
@RequiredArgsConstructor//생성자 DI를 위한 lombok 어노테이션
@Configuration
public class SimpleJobConfig {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@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();
}
}
생성한 java파일 안에 simpleJob이란 이름의 간단한 Spring Batch 코드를 작성한다.
@Configuration
Spring Batch의 모든 Job은 @Configuration으로 등록해서 사용한다.
jobBuilderFactory.get("simpleJob")
simpleJob 이란 이름의 Batch Job을 생성한다.
jobBuilderFactory 클래스의 get() 메소드로 JobBuilder를 생성한다.
이렇게 생성된 JobBuilder로 Job을 생성한다.
.start(simpleStep1())
Step을 추가해서 가장 기본이 되는 SimpleJobBuilder를 생성한다.
stepBuilderFactory.get("simpleStep1")
simpleStep1 이란 이름의 Batch Step을 생성한다.
jobBuilderFactory.get("simpleJob")와 마찬가지로 Builder를 통해 이름을 지정한다.
.tasklet((contribution, chunkContext))
Step 안에서 수행될 기능들을 명시합니다.
Tasklet은 Step안에서 단일로 수행될 커스텀한 기능들을 선언할때 사용합니다.
여기서는 Batch가 수행되면 log.info(">>>>> This is Step1") 가 출력되도록 합니다.
이 간단한 Spring Batch 어플리케이션을 실행해본다.
처음 만들어졌던 Application.java의 main 메소드를 실행하면 Batch가 실행된다.
실행해보면 위의 사진처럼 log.info(">>>>> This is Step1")가 잘 수행되어 로그가 찍힌것을 알 수 있다.
위의 Batch Job 코드를 살펴보면 simepleJob(Job)이 simepleStep1(Step)을 품고 있음을 확인할 수 있다.
Spring Batch에서 Job은 하나의 배치 작업 단위를 의미한다. 이때 Job은 여러 step으로 구성되어 있다.
하나의 Batch 작업을 수행하기 위해서는 몇 단계의 step을 밟도록 구성할 수 있다는 것이다.
step은 Tasklet 혹은 Reader/Processor/Writer의 묶음으로 구성되어 있다. 이때 Tasklet 하나와
Reader/Processor/Writer 묶음은 같은 레벨의 단위로, Reader/Processor가 끝나고 Tasklet으로 마무리 짓는 등의 구성은 할 수 없다.
https://jojoldu.tistory.com/325?category=902551
https://minholee93.tistory.com/entry/Spring-Batch-Batch-Job?category=924031
https://hororolol.tistory.com/513