본문 바로가기

Develop/Back-End

스프링 배치(Spring Batch) 시작하기 !😭

스프링 배치

 

 

스프링 배치 5가 릴리즈된지 거의 1년이 흘렀는데 이 때는 안보고 있다가.. 😛

급하게 스케줄러와 배치를 이용해야 되는 일이 생겻다 😥

 

내가 만들어야 할 프로그램 프로세스 흐름은  이와 같다.

프로그램 한 사이클이 돌아가는데 약 2시간 조금  안되게 걸리고 있는 상황인데, ( 마스터 데이터가 늘어날 수록 시간이 곱이 되는 상황)  개발 하고 나서 어느점을 보완해야 되는지 설명 하는게 더 빠를 것 같아서 일단 개발한다..

배치 was,api was가 버틸수 있을 지 모르겠다.. 스케줄 시간보다 잡이 더 길어질수도 있는 상황.😑

 

기술적으로 자문을 구할 수 있는 상황이 아니며.. 정책적으로도 풀 수 없는 상황이라 참 난처하다..

최대한 스케일 아웃으로 풀어야 하는데.. 머리가 너무 아프다 😩

 

일단 만들어보자 😵

 

아래 프로세스 흐름은 내가 만들어야 할 자동화 프로그램이다

스프링 배치 + 쿼츠 스케줄러로 구현해보려 한다.

 

 

 

 

 


Spring Batch 주요 프로세스 흐름과 용어 정리

주요용어와 프로세스를 알고 시작하면

보다 쉽게 접근할 수 있다고 나는 생각한다.

 

스프링배치 주요 흐름 이미지 출처 (https://terasoluna-batch.github.io/)

 

  1. 스프링 배치 (Spring Batch):
    • 스프링 배치는 대규모 데이터 처리 작업을 자바 기반의 배치 처리 어플리케이션을 만들기 위한 프레임워크
    • 대용량 데이터를 처리하는 경우나 주기적인 업무 일괄 처리 등에 사용
    • 스프링 배치는 배치 작업을 트랜잭션 처리와 함께 관리하고, 실패한 작업을 복구하고 재시작할 수 있는 기능을 제공
    • 잡(Job), 스텝(Step), 리더(Reader), 프로세서(Processor), 라이터(Writer) 등의 개념을 이용하여 배치 처리를 설계하고 실행
  2. 쿼츠 (Quartz):
    • 쿼츠는 자바 기반의 오픈 소스 스케줄링 라이브러리
    • 스케줄링 작업을 관리하고 실행할 수 있는 기능을 제공
    • 주기적으로 실행되어야 하는 작업이나 예약된 작업을 관리하고 실행하는 데 사용
    • 쿼츠는 크론 표현식을 사용하여 실행 스케줄을 설정하고, 다양한 트리거(trigger)를 통해 작업을 실행할 수 있음
    • 분산 환경에서도 사용할 수 있는 확장 가능한 아키텍처를 가지고 있어, 대규모 시스템에서도 유연하게 활용됨

요약하자면, 스프링 배치는 대규모 데이터 처리를 위한 일괄 처리 프레임워크이고, 쿼츠는 예약된 작업을 스케줄링하고 실행하는 데 사용되는 라이브러리 함께 사용되어 시스템에서 정기적인 작업 처리와 스케줄링을 효과적으로 관리할 수 있음

 

 

Job : 전체 배치 프로세스를 캡슐화한 엔티티, 배치 처리 과정을 하나의 단위로 만들어 놓은 객체

 

JobInstance : Job 실행의 단위(job이 각각 실행할 때마다 따로 추적할 수 있도록 매 실행마다 생성되며 특정 job과 식별 가능한 JobParameters에 상응하는 JobInstance는 단 한 개뿐이다.)

 

JobParameters : JobInstance에 전달되는 매개변수 역할, JobInstance를 구분하는 식별자 역할

 

JobExecution : Job에 대한 실행 시도 정보를 담은 객체.

 

Step : 배치 Job의 배치처리를 정의하고 순차적인 단계를 캡슐화 한 도메인 객체. Job은 하나 이상의 Step을 가져야 한다.

 

StepExecution : Step에 대한 실행 시도 정보를 담은 객체.

 

ExecutionContext : 프레임워크에서 유지/관리하는 key-value의 컬렉션. StepExecution객체 또는 JobExecution객체에 속하는 상태를 저장

 

JobExecutionContext : Commit 시점에 저장

 

StepExecutionContext : 실행 사이에 저장

 

JobRepository : 위에 업근된 모든 저장(Persistence)매커니즘을 담당.(JobLauncher, Job, Step 구현체에 CRUD 기능을 제공)

 

JobLauncher : 주어진 JobParameters로 Job을 실행하는 간단한 인터페이스.

 

Item Reader : Step에서 아이템을 한 번에 하나씩 읽어오는 작업을 추상화한 개념

 

Item Writer : Step에서 배치나 청크 단위로 아이템을 출력하는 작업을 추상화한다.

 

Item Processor : 아이템을 처리하는 비즈니스 로직을 나타내는 추상화 개념

 

 


https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration-Guide

 

Spring Batch 5.0 Migration Guide

Spring Batch is a framework for writing batch applications using Java and Spring - spring-projects/spring-batch

github.com

 

 

 

스프링배치5부터는 매인 애플리케이션에 @EnableBatchProcessing 어노테이션을 사용할 필요가 없다.

자세한 내용은 마이그레이션 가이드부터 읽어 보길 권장한다!!

 

 

spring-boot-starter-batch,spring-boot-starter-quartz  배치를 사용하기 위해 배치,쿼츠 종속성 추가

 

 

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.2.2'
	id 'io.spring.dependency-management' version '1.1.4'
}

group = 'ndj.batch'
version = '0.0.1-SNAPSHOT'

java {
	sourceCompatibility = '17'
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-batch'
	implementation'org.springframework.boot:spring-boot-starter-quartz'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	runtimeOnly 'com.h2database:h2'
	compileOnly('org.projectlombok:lombok')
	annotationProcessor 'org.projectlombok:lombok'
	testAnnotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.batch:spring-batch-test'
}

tasks.named('test') {
	useJUnitPlatform()
}

 

 

간단한 잡 생성해보기.

 

package ndj.batch.demo.job;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.builder.StepBuilder;
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;
import org.springframework.transaction.PlatformTransactionManager;

@Slf4j
@RequiredArgsConstructor
@Configuration
public class SimpleJob {

    @Bean(name = "simpleJob1")
    public Job simpleJob1(JobRepository jobRepository, Step simpleStep1) {
        log.info(">>> simpleJob1");
        return new JobBuilder("simpleJob1", jobRepository)
                .start(simpleStep1)
                .build();
    }
    @Bean("simpleStep1")
    public Step simpleStep1(JobRepository jobRepository, Tasklet testTasklet, PlatformTransactionManager platformTransactionManager){
        log.info(">>> simpleStep1");
        return new StepBuilder("simpleStep1", jobRepository)
                .tasklet(testTasklet, platformTransactionManager).build();
    }
    @Bean
    public Tasklet testTasklet(){
        return ((contribution, chunkContext) -> {
            log.info(">>>>> Tasklet");
            return RepeatStatus.FINISHED;
        });
    }
}

 

 

 

 

 


 

 

메타테이블 정보 🛠

메타테이블은 소스 코드나 메타데이터 역할을 할 데이터를 보유하도록 지정된 데이터베이스 또는 기타 데이터 보유 구조의 섹션입니다. 대부분의 경우 메타테이블에서 데이터를 읽고 찾은 데이터에 따라 다양한 작업을 수행하도록 특정 소프트웨어가 작성되었습니다. ( 위키백과 )

 

BATCH_JOB_EXECUTION 배치 작업 실행에 대한 정보를 저장 (각 배치 작업의 실행에 대한 기본 정보와 상태를 포함)
BATCH_JOB_EXECUTION_CONTEXT 배치 작업 실행에 필요한 컨텍스트 정보를 저장 (예로 JobExecutionContext의 속성들이 여기에 저장)
BATCH_JOB_EXECUTION_PARAMS 배치 작업 실행에 전달된 매개변수 정보를 저장
BATCH_JOB_INSTANCE 배치 작업의 인스턴스에 대한 정보를 저장 (여러 번 실행될 수 있는 동일한 작업의 각 인스턴스를 식별)
BATCH_STEP_EXECUTION 배치 스텝의 실행에 대한 정보를 저장합니다. 각 스텝 실행에 대한 상태와 통계를 추적합니다.
BATCH_STEP_EXECUTION_CONTEXT 배치 스텝 실행에 필요한 컨텍스트 정보를 저장합니다.

 

QRTZ_BLOB_TRIGGERS  Quartz에서 Blob 형태의 트리거 정보를 저장
QRTZ_CALENDARS Quartz 캘린더 정보를 저장 (캘린더는 특정 시간에 트리거를 활성화 또는 비활성화할 수 있도록 함)
QRTZ_CRON_TRIGGERS Quartz에서 Cron 표현식을 사용하는 트리거 정보를 저장
QRTZ_FIRED_TRIGGERS 실행된 트리거에 대한 정보를 저장
QRTZ_JOB_DETAILS  Quartz 작업에 대한 상세 정보를 저장
QRTZ_LOCKS  Quartz에서 사용되는 락 정보를 저장
QRTZ_PAUSED_TRIGGER_GRPS 일시 중단된 트리거 그룹에 대한 정보를 저장
QRTZ_SCHEDULER_STATE Quartz 스케줄러의 상태 정보를 저장
QRTZ_SIMPLE_TRIGGERS Quartz에서 간단한 트리거 정보를 저장
QRTZ_SIMPROP_TRIGGERS Quartz에서 사용되는 특별한 속성을 가진 트리거 정보를 저장
QRTZ_TRIGGERS Quartz 트리거에 대한 기본 정보를 저장

 

 


참고 Ref.

 

 

https://docs.spring.io/spring-batch/reference/

 

Overview :: Spring Batch

The reference documentation is divided into several sections:

docs.spring.io

 

https://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html

 

 

Cron Trigger Tutorial

CronTrigger Tutorial Introduction cron is a UNIX tool that has been around for a long time, so its scheduling capabilities are powerful and proven. The CronTrigger class is based on the scheduling capabilities of cron. CronTrigger uses “cron expressions

www.quartz-scheduler.org

 

https://terasoluna-batch.github.io/guideline/5.0.0.RELEASE/en/Ch02_SpringBatchArchitecture.html#:~:text=Primary%20components%20of%20Spring%20Batch%20and%20overall%20process%20flow

 

Spring Batch Architecture

Spring Batch architecture acting as a base for TERASOLUNA Server Framework for Java (5.x) is explained. What is Spring Batch Spring Batch, as the name implies is a batch application framework. Following functions are offered based on DI container of Spring

terasoluna-batch.github.io

 

https://github.com/DongJu-Na/spring-batch-skelton

 

GitHub - DongJu-Na/spring-batch-skelton: Spring Batch Skelton Code 💀

Spring Batch Skelton Code 💀. Contribute to DongJu-Na/spring-batch-skelton development by creating an account on GitHub.

github.com

 

반응형