스프링 배치 5가 릴리즈된지 거의 1년이 흘렀는데 이 때는 안보고 있다가.. 😛
급하게 스케줄러와 배치를 이용해야 되는 일이 생겻다 😥
내가 만들어야 할 프로그램 프로세스 흐름은 이와 같다.
프로그램 한 사이클이 돌아가는데 약 2시간 조금 안되게 걸리고 있는 상황인데, ( 마스터 데이터가 늘어날 수록 시간이 곱이 되는 상황) 개발 하고 나서 어느점을 보완해야 되는지 설명 하는게 더 빠를 것 같아서 일단 개발한다..
배치 was,api was가 버틸수 있을 지 모르겠다.. 스케줄 시간보다 잡이 더 길어질수도 있는 상황.😑
기술적으로 자문을 구할 수 있는 상황이 아니며.. 정책적으로도 풀 수 없는 상황이라 참 난처하다..
최대한 스케일 아웃으로 풀어야 하는데.. 머리가 너무 아프다 😩
일단 만들어보자 😵
아래 프로세스 흐름은 내가 만들어야 할 자동화 프로그램이다
스프링 배치 + 쿼츠 스케줄러로 구현해보려 한다.
Spring Batch 주요 프로세스 흐름과 용어 정리
주요용어와 프로세스를 알고 시작하면
보다 쉽게 접근할 수 있다고 나는 생각한다.
- 스프링 배치 (Spring Batch):
- 스프링 배치는 대규모 데이터 처리 작업을 자바 기반의 배치 처리 어플리케이션을 만들기 위한 프레임워크
- 대용량 데이터를 처리하는 경우나 주기적인 업무 일괄 처리 등에 사용
- 스프링 배치는 배치 작업을 트랜잭션 처리와 함께 관리하고, 실패한 작업을 복구하고 재시작할 수 있는 기능을 제공
- 잡(Job), 스텝(Step), 리더(Reader), 프로세서(Processor), 라이터(Writer) 등의 개념을 이용하여 배치 처리를 설계하고 실행
- 쿼츠 (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
스프링배치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/
https://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html
https://github.com/DongJu-Na/spring-batch-skelton
'Develop > Back-End' 카테고리의 다른 글
[SpringBoot] 스프링을 이용하여 가벼운(간단한) 스케줄링 작업 처리하는 방법 😁 (4) | 2024.08.13 |
---|---|
[Java] 모던 자바(Modern JAVA) 란 무엇인가!!!!😒 (feat. 새롭게 추가된 기능들) (105) | 2024.03.24 |
스프링 부트 카카오 로그인 API 기능 추가하기 😳 (114) | 2023.10.22 |
Spring Boot 환경에서 Appium을 통해 모바일 환경 테스트 하기 + 플러그인 (09.19 수정) (66) | 2023.09.17 |
Selenium 을 이용하여 특정 URL 요청과 응답 값 모니터링 하는 기능 만들기 (77) | 2023.09.07 |