[Spring Batch] Batch Job

dev-log·2021년 11월 16일
0

Spring Batch

목록 보기
2/7
post-thumbnail

이번 시간에는 간단한 Spring Batch Job을 생성 & 실행 해보도록 한다.

1. 개발환경 세팅하기

  • 기본적인 프로젝트 개발 환경
- IntelliJ 
- Spring Boot 2.1.7
- Java 11
- Gradle

  1. 인텔리제이에서 새로운 프로젝트 생성한다.
    (Gradle -> Java)

  2. 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'
}
  1. main 메소드 생성하기

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을 생성하려 한다.

2. Simple 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")가 잘 수행되어 로그가 찍힌것을 알 수 있다.

3. Job의 구조

위의 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으로 마무리 짓는 등의 구성은 할 수 없다.

Reference

https://jojoldu.tistory.com/325?category=902551
https://minholee93.tistory.com/entry/Spring-Batch-Batch-Job?category=924031
https://hororolol.tistory.com/513

profile
배운 걸 기록하는 곳입니다.

0개의 댓글