본문 바로가기
Java

[Spring Batch] #1 스프링 배치란?(기본 개념 및 예제 포함)

by Jayson Jeong 2022. 9. 20.

프로젝트 수행 중 배치 프로그램을 개발하면서 Spring Batch에 대해 공부하고 이해한 내용을 기록하고 공유하고자 한다.

Spring Batch에 대한 더욱 정확하고 자세한 정보들은 커뮤니티나 타 블로그에 이미 많이 기재되어 있으므로 프로젝트에 도움이 됐던 내용에 초점을 맞추도록 하겠다.

 

1. 스프링 배치(Spring Batch)란? 

스프링 배치는 스케줄러가 아니다.

대용량 일괄처리의 편의를 위해 설계된 가볍고 포괄적인 배치 프레임워크로 원하는 일정에 따라 실행되도록 스케줄러를 통해 설정하고 실행되는 프로세스의 비즈니스 로직을 설계하여 실행방법에 초점을 맞추는게 스프링 배치라고 생각한다.

 

대용량의 데이터를 원하는 크기만큼 반복을 돌릴 수도 있고

예외가 발생했을 경우 스킵, 재시도, 복구, 분기 등 설정을 할 수 있다.

또한 DB에 데이터를 저장하다가 에러 발생 시 전부 롤백을 하는게 아닌 정상 실행부분까지 커밋하고

이후 진행에서 에러 발생 시점부터 재시작하는 등 상상하는 웬만한 로직은 전부 구현이 가능하다.

 

2. 스프링 배치 아키텍처

스프링 배치를 실행해보기 전에 앞서 스프링 배치의 기본적인 실행순서를 형식없이 설명해보려고 한다.

스프링 배치 프레임워크를 사용하기 위해선 @EnableBatchProcessing 어노테이션을 사용해야 한다.

스프링 부트일 경우 @SpringBootApplication과 함께 사용해도 되고 배치 Job을 설정한 Class에서 사용해도 된다. 

중요한 건 스프링이 @EnableBatchProcessing 스캔해야 Runner가 실행된다는 것이다.

 

Spring Batch의 Architecture

 

스프링 배치가 실행되면 Selector에 의해 Default인 SimpleBatchConfiguration이 생성된다.

이때 SimpleBatchConfiguration에 주입되는 객체는 LazyInstance에 의해 BatchConfigurer에서 생성한 객체가 주입된다.

이 순서를 이용해서 BatchConfigurer를 Override해서 배치 DB를 사용하지 않는 메모리 저장 방식으로 설정도 가능하다.

 

spring-autoconfigure-metadata.properties 설정값을 통해

BatchAutoConfiguration이 자동 생성되며 Configuration 정보를 바탕으로 JobLauncherApplicationRunner가 생성된다.

JobLauncherApplicationRunner가 args에 저장된 JobName을 통해 SimpleJobLauncher에 Job을 전달한다.

SimpleJobLauncher에서 Job이 실행되고 이후 Job이 완료될때까지 JobExecution을 통해 Job을 관리 및 실행한다.

RepeatStatus, ExitStatus 정보를 통해 다음 Step 이동, Job 종료 등을 파악한다.

 

3. 스프링 배치 Job의 기본 구조

Job과 Step의 구조

Spring Batch는 기본적으로 Job, Step으로 구성할 수 있다.

Job은 한 개 이상의 Step으로 구성할 수 있다.

 

Step의 구성

Step은 오직 한 개의 Tasklet 또는 ItemReader, ItemProcessor, ItemWriter로 구성할 수 있으며

ItemProcessor는 필요에 따라 있어도 되고 없어도 된다.

 

4. Spring Batch 기본 실행 예제

1. 스프링 배치 사용 선언

exclude DataSourceAutoConfiguration.class를 선언해주는 이유는

스프링배치에서 자동으로 DataSource를 읽기 때문이다.

단순 테스트 목적으로 DataSource 없이 배치를 실행하기 위해 선언한다.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

@SpringBootApplication(exclude =  { DataSourceAutoConfiguration.class})
@EnableBatchProcessing
public class BatchApplication {
	public static void main(String[] args) {
		SpringApplication.run(BatchApplication.class, args);
	}

}

 

2. Job Configurer 설정

public class StepCycleTestJobConfigurer {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    public StepCycleTestJobConfigurer(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory){
    	this.jobBuilderFactory = jobBuilderFactory;
        this.stepBuilderFactory = stepBuilderFactory;
    }
    
    @Bean
    public Job stepCycleTestJob() throws DataNotFoundException {
        return jobBuilderFactory.get("stepCycleTestJob")
                .start(stepNextStep1())
                .next(stepNextStep2())
                .next(stepNextStep3())
                .build();
    }
    
    @Bean
    public Step stepNextStep1(){
        return stepBuilderFactory.get("stepNextStep1")
                .tasklet((contribution, chunkContext) -> {
                    System.out.println(">>>>Step1 입니다.");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
    
    @Bean
    public Step stepNextStep2(){
        return stepBuilderFactory.get("stepNextStep2")
                .tasklet((contribution, chunkContext) -> {
                    System.out.println(">>>>Step2 입니다.");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
    
    @Bean
    public Step stepNextStep3(){
        return stepBuilderFactory.get("stepNextStep3")
                .tasklet((contribution, chunkContext) -> {
                    System.out.println(">>>>Step3 입니다.");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
    
}

 

전체 소스

https://github.com/JeongJiSang/spring-batch-sample.git