지나공 : 지식을 나누는 공간

[2] Spring Batch 프로젝트 구성 본문

Tech/Batch

[2] Spring Batch 프로젝트 구성

해리리_ 2022. 3. 20. 02:10

설정 사항들

@EnableBatchProcessing

스프링배치가 작동하려면 이 어노테이션을 선언해야 한다.

- 총 4개의 설정 클래스를 실행시키고 스프링 배치의 모든 초기화 및 실행 구성이 이루어진다.

- 스프링 부트 배치의 자동 설정 클래스가 실행되면서 빈으로 등록된 모든 Job을 검색해서 초기화와 동시에 Job을 수행할 수 있도록 구성된다.

 

설정 클래스 4가지는 아래와 같다.

1. BatchAutoConfiguration

  • 스프링 배치가 초기화될 때 자동으로 실행되는 설정클래스
  • Job을 수행하는 JobLauncherApplicationRunner 빈을 생성한다. JobLauncerApplicationRunner는 자동으로 배치 Job들을 실행시키는 클래스다.

2. SimpleBatchConfiguration

  • JobBuilderFactory와 StepBuilderFactory를 생성한다.
  • 스프링 배치의 주요 구성 요소를 생성하는데 이 구성요소들은 프록시 객체로 생성된다.
  •  

주요 객체들을 빈으로 갖고 있고, crazyLazyProxy라고 되어있네.

3. BatchConfigurerConfiguration

  • BasicBatchConfigurer
    • 위 SimpleBatchConfiguration에서 생성한 주요한 구성요소의 프록시 객체의, 실제 대상 객체를 생성하는 설정 클래스.
    • 빈으로 의존성을 주입 받아서 주요 객체들을 참조해서 사용할 수 있다. 우리가 활용할 수 있다는 말임.
  • JpaBatchConfigurer (extends BasicBatchConfigurer)
    • JPA 관련 객체를 생성하는 설정 클래스.
  • 우리에게 맞게 직접 커스텀해서 BatchConfigurer 인터페이스를 구현하고 사용할 수 있다. 

실행되는 순서

@EnableBatchProcessing -> SimpleBatchConfiguarion을 초기화하는 게 호출되고 -> BatchConfigurerConfiguration -> 마지막으로 JobLauncherApplicationRunner를 가지고 있는 BatchAutoConfiguration이 실행된다.

 

여기까지 의존성을 추가했고 그 후 스프링 배치를 초기화하여 실행할 수 있게 해주는 어노테이션인 @EnableBatchProcessing을 달았다.

 

스프링 배치를 시작해보자!

일단 간단한 설정 파일부터 살펴보자.

@Configuration

하나의 배치 Job을 정의하고 빈을 설정. 정의라는 건 실행할 수 있는 각각의 내용들, 빈들을 설정하고 구성한다는 말.

 

JobBuilderFactory, StepBuilderFactory

Job을 생성하는 빌더 팩토리와 Step을 생성하는 빌더 팩토리.

Job이나 Step을 생성할 때 우리가 직접 new 로 생성하지 않고 빌더 팩토리의 도움을 받아서 쉽게 job을 생성하도록 스프링 배치가 이런 util성 클래스들을 제공한다.

 

Job

helloJob이라는 이름으로 Job을 생성. Job이라는 여러 개의 일, 일감들이 있다.

 

Step

helloStep이라는 이름으로 Step을 생성. 일(Job)의 항목, 단계를 의미한다.

 

Tasklet

Step 안에서 단일 태스크로 수행되는 로직을 구현한다. tasklet이라는 인터페이스가 있고 이 구현체를 stepBuilder 만들 때 할당할 수 있다. 실제 작업 내용, 비즈니스 로직이 구현되어 있는 부분이다. 

 

실행 흐름

아래 그림처럼 Job이 구동되면 Step을 실행하고, Step이 구동되면 Tasklet을 실행하도록 설정되어 있다.

1. Job을 구동하면서 .start(helloStep())을 통해 step을 실행한다.

2. Step이 실행될 때 .tasklet()을 통해 사전에 할당해둔 우리가 원하는 비즈니스 로직이 실행된다.

 

Step1, Step2를 만들고 순차적으로 실행해보면 아래와 같다. 굉장히 직관적임..! .start(step1).next(step2)....

package io.springbatch.springbatchlecture.config;

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") // Job 생성
                .start(helloStep1())
                .next(helloStep2())
                .build();
    }

    @Bean
    public Step helloStep1() {
        return stepBuilderFactory.get("helloStep1") //Step 생성
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                        System.out.println("==========================");
                        System.out.println(" >> Hello Spring Batch!!");
                        System.out.println("==========================");
                        return RepeatStatus.FINISHED; //tasklet은 기본적으로 반복 수행되는데 finished로 하면 1번만 실행됨,
                    }
                })
                .build();
    }

    @Bean
    public Step helloStep2() {
        return stepBuilderFactory.get("helloStep2")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                        System.out.println("==========================");
                        System.out.println(" >> Step2 was executed!!");
                        System.out.println("==========================");
                        return RepeatStatus.FINISHED; //tasklet은 기본적으로 반복 수행되는데 finished로 하면 1번만 실행됨,
                    }
                })
                .build();
    }
}

 

자료 출처 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98/dashboard

728x90

'Tech > Batch' 카테고리의 다른 글

Spring Batch의 도메인 이해  (0) 2023.12.24
[1] Spring Batch 개요와 아키텍처  (1) 2022.03.17
[0] Spring Batch, Scheduler 카테고리를 여는 글  (2) 2022.03.16
Comments