Lined Notebook

Spring Batch Introduction

by HeshAlgo

1. 스프링 배치?

스프링 배치는 일괄처리를 위한 오픈 소스 프레임워크입니다. 즉, 비즈니스 운영을 수행하기 위해 대용량 처리가 필요한 경우 스프링 배치를 이용할 수 있습니다. 이런 대용량 처리에는 다양한 예시가 있습니다. 

- 월말 계산과 같은 시간 기반 이벤트

- 하루 100만 개의 통계를 내어야 하는 작업

- 매일 1000개의 데이터를 DB에 Insert 해야 하는 작업 등

위의 세 가지 예시뿐만 아니라 그 외에도 다양하게 대용량 처리가 필요할 경우 스프링 배치를 이용할 수 있습니다.

 

2. 스프링 배치 아키텍처

스프링 배치는 이 세 가지의 구성 요소 아키텍처를 가지고 있습니다.

1) Application

-> 개발자가 만든 모든 배치 Job과 사용자 정의 코드가 포함되어 있습니다.

-> 개발자는 비즈니스 로직 구현에만 집중하고 공통적인 기반 기술은 프레임워크가 담당합니다.

 

2) Batch Core

-> 배치 작업을 시작하고 제어하는데 필요한 핵심 런타임 클래스가 포함됩니다. (JobLauncher, Job, Step 등..)

 

3) Batch Infrastructure

-> Application, Batch Core 모두 Infrastructure Layer에서 빌드됩니다.

-> Job의 흐름과 처리를 위한 틀을 제공하며 Reader, Processor, Writer 등이 속합니다.

 

3. 스프링 배치 어노테이션

1) 스프링 배치 초기화 설정 클래스

- BatchAutoConfiguration

스프링 배치가 초기화될 때 자동으로 실행되는 설정 클래스

Job을 수행하는 JobLauncherApplicationRunner 빈을 생성

스프링 부트가 해당 JobLauncherApplicationRunner클래스가 Job을 수행시켜 준다.

 

- SimpleBatchConfiguration

JobBuilderFactory와 StepBuildFactory 생성

스프링 배치의 주요 구성 요소가 생성되는데 해당 구성 요소는 프락시 객체로 생성

 

- BatchConfigurerConfiguration

    - BasicBatchConfigurer

         - SimpleBatchConfiguration에서 생성한 프록시 객체의 실제 대상 객체를 생성하는 설정 클래스

         - 빈으로 의존성 주입받아서 주요 객체들을 참조해서 사용할 수 있다.

    - JpaBatchConfigurer

         - JPA 관련 객체를 생성하는 설정 클래스

 

이 해당 클래스가 실행되는 순서를 간략하게 나타내면

@EnableBatchProcessing -> SimpleBatchConfiguration -> BatchConfigurerConfiguration -> BatchAutoConfiguration

이렇게 순서가 진행되데 실제 @EnableBatchProcessing 내부를 들여다보거나 디버깅 시에 해당 순서로 실행되는 모습을 볼 수 있습니다.

 

4. 스프링 배치 의존성 추가

Spring Batch의 의존성을 추가함으로써 Spring Batch를 사용할 수 있습니다.

저 같은 경우 Gradle을 이용해 추가하였고 프로젝트를 첫 생성 시 Spring Batch Dependency를 추가하게 되면 spring-boot-starter-batch 의존성이 추가되는 것을 확인해 볼 수 있습니다. 

 

주의할 점!
현재 Spring Boot 3 버전으로 사용 시 Spring Batch 버전이 5 버전으로 의존성이 다운로드될 것입니다. 

아직은 Spring Batch5로 버전업 되면서 어떤 것들이 변화가 있는지 확인을 하지 못하여 Spring Boot 사용 시 2 버전으로 사용하는 것을 추천드립니다.

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-batch")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    runtimeOnly("com.mysql:mysql-connector-j")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("org.springframework.batch:spring-batch-test")
}

여기서 spring-boot-starter-batch와 spring-batch-core의 차이점이 궁금하신 분들이 계실 거 같은데 해당 설명은 해당 게시글의 아랫부분에 설명하도록 하겠습니다.

 

5. spring-boot-starter-batch와 spring-batch-core의 차이 

spring-boot-stater-batch는 스프링 부트 기반 애플리케이션에서 스프링 배치를 사용하기 위한 스타터 의존성입니다.

해당 의존성을 추가하면 스프링 부트가 자동으로 필요한 설정을 처리하고 스프링 배치를 사용할 수 있게 해 줍니다.

spring-batch-core는 스프링 배치의 핵심 라이브러리로서, 배치처리 작업을 위한 핵심 기능과 클래스를 제공해 줍니다. 예를 들어 Job, Step, ItemReader, ItemWriter 등이 이 라이브러리에 포함됩니다.

 

우리는 spring-boot-stater-batch만 추가함으로써 스프링 부트는 스프링 배치에 필요한 의존성들을 포함하여 spring-batch-core도 가져오게 됩니다. 

그런데 저 같은 경우 spring-boot-stater-batch와 spring-batch-core의 의존성을 전부 명시해 주었습니다.

그 이유는 spring-boot-stater-batch의 버전을 낮게 수정해 줬는데도 불구하고 spring-batch-core버전이 5 버전으로 명시가 되더군요...ㅠㅠ 해당 원인은 아직 파악하지 못한 관계로 해당 core의 버전도 명시하게 되었습니다.

해당 원인을 발견하게 되면 해당 포스트글을 수정하거나 새로 게시글을 작성하도록 하겠습니다!

 

 

참고 문헌 😶

https://docs.spring.io/spring-batch/docs/current/reference/html/spring-batch-intro.html#spring-batch-intro

'Spring Batch' 카테고리의 다른 글

Spring Batch Step  (0) 2023.05.22
Spring Batch Job  (0) 2023.05.22
스프링 배치 DB 스키마  (0) 2022.02.01

블로그의 정보

꾸준히 공부하는 개발 노트

HeshAlgo

활동하기