본문 바로가기

강의/스프링배치

스프링 배치 시작 - 연습용 배치 생성

1. 기본 설정


스프링 배치를 실행하기 위해, 기본적인 설정을 추가해주자.

 

pom.xml

 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-batch</artifactId>
</dependency>

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>


<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
    <scope>provided</scope>
</dependency>

 

 

2. 스프링 배치 실행


스프링 배치의 구조는 아래와 같다.

Job은 여러개의 Step을 가질 수 있으며,

Step은 여러개의 Tasklet을 가질 수 있다.

Tasklet은 Business logic이라고 볼 수 있다.

 

코드를 작성해보자.

 

package io.springbatch.springbatch;

import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@RequiredArgsConstructor
@Configuration
public class HelloJobConfiguration {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job helloJob() {
        return jobBuilderFactory.get("helloJob")
                .start(helloStep1())
                .next(helloStep2())
                .build();
    }

    @Bean
    public Step helloStep2() {
        return stepBuilderFactory.get("helloStep1")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
                        // return null <- tasklet의 기능이 한번만 실행되도록 한다.
                        // return null;

                        System.out.println(" ====================== ");
                        System.out.println(" >> Hello Spring Batch!!");
                        System.out.println(" ====================== ");

                        // return null과 동일하게 tasklet의 기능이 한번만 실행되도록 하는 것이다.
                        return RepeatStatus.FINISHED;
                    }
                })
                .build();
    }

    @Bean
    public Step helloStep1() {
        return stepBuilderFactory.get("helloStep1")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
                        // return null <- tasklet의 기능이 한번만 실행되도록 한다.
                        // return null;

                        System.out.println(" ====================== ");
                        System.out.println(" >> step2 was excuted!!");
                        System.out.println(" ====================== ");

                        // return null과 동일하게 tasklet의 기능이 한번만 실행되도록 하는 것이다.
                        return RepeatStatus.FINISHED;
                    }
                })
                .build();
    }
}

 

Job은 일, 일감을 의미하며

Step은 일의 항목, 단계를 의미한다.

Tasklet은 작업 내용을 의미한다.

 

@Configuration 선언

 - 하나의 배치 Job을 정의하고 빈 설정

 

JobbuilderFactory

 - Job을 생성하는 빌더 팩토리

 

StepBuilderFactory

 - Step을 생성하는 빌더 팩토리

 

Job

 - helloJob 이름으로 job 생성

 

Step

 - helloStep 이름으로 Step 생

 

tasklet

 - Step 안에서 단일 테스크로 수행되는 로직 구현

 

3. 기본적인 구조


job을 정의할 때 spring batch가 job을 편리하게 구성할 수 있는 몇가지 유틸성 클래스를 제공하는데

그중의 한가지가 JobBuilderfactory, StepBuilderFactory이다.

 

JobBuilderFactory, StepBuilderFactory는 각각 job과 step을 쉽게 생성할 수 있도록 도와주는 클래스이다.

사용하는 방법은 의존성 주입을 받아서 아래와 같이 선언하면 된다.

 

Job또는 Step을 생성할때 new job, new step을 생성하지 않고 
builderfactory의 도움을 받아서 쉽게 생성할 수 있게 되었다.

 

4. 코드 설명


jobBuilderfactory.get("helloJob") <= helloJob 생성

build()를 하게 되면 job의 구현체가 Job은 인터페이스인데 기본적으로 제공하는 구현체가 생성이 된다.

.start(helloStep()) 

 

stepBuilderFactory.get("hellStep") Step 생성

 

tasklet이라는 interface가 있고 

우리가 구현한 비즈니스 로직을 넣어주면 된다.

 

Job이 구동되면 Step을 실행하고

Step이 구동되면 Tasklet을 실행하도록 설정함.

 

Simplejob springbatch가 만든 구현체

helloJob 우리가 만든 job

Spring boot가 실행시켜 줬다

parameters는 공백으로 되어있는데 별도의 파라미터를 넣어주지 않았기 때문이다.

 

Step이 실행되었다 helloStep1, hellostep2

tasklet에 출력하도록 기술한 문구가 출력되었다.