Spring Batch는 로깅 및 추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기 및 리소스 관리를 포함한 대량의 데이터를 사용자의 개입 없이 자동 처리를 제공하는 배치 프레임워크이다.
또한 엔터프라이즈 시스템의 일상적인 운영에 필수적인 강력한 배치 애플리케이션을 개발할 수 있고, 스케줄러를 대체하는 것이 아닌 스케줄러와 함께 작동하도록 설계되었다.
스프링 배치 공식 문서 내용
spring Batch is a lightweight, comprehensive batch framework designed to enable the development of robust batch applications that are vital for the daily operations of enterprise systems.
There are many good enterprise schedulers (such as Quartz, Tivoli, Control-M, and others) available in both the commercial and open source spaces. Spring Batch is intended to work in conjunction with a scheduler rather than replace a scheduler.
아래의 다이어그램과 같이 스프링 배치는 하나의 작업(Job)에는 여러 단계(Step)이 있으며, 각 단계는 ItemReader, ItemProcessor, ItemWriter가 있다. JobLauncher 인터페이스 작업을 시작할 수 있게 해 주고, 현재 실행 중인 프로세스에 대한 메타데이터는 JobRepository에 저장한다.
Job은 전체 배치 프로세스를 캡슐화하는 엔터티로 다른 Spring 프로젝트와 마찬가지로 작업은 XML 구성 파일 또는 Java 기반 구성과 함께 연결된다. 스프링 배치에서 Job은 Job의 이름과 Step 인스턴스, 작업을 다시 시작할 수 있는지에 대한 속성을 포함한다.
JobInstance는 Job의 실행 단위이다.
위 계층구조의 작업에서 EndOfDay 작업과 같이 하루가 끝날 때 한 번 실행되어야 하는 배치 작업의 경우 EndOfDay라는 작업이 하나 존재하지만 실행마다 개별적인 JobInstance가 생성된다.
예를 들어 1월 1일, 1월 2일 등 매일 실행되는 배치 작업이 있다고 가정했을 때, 1월 1일의 실행을 실패하고 다음날 다시 실행되면 여전히 1월 1일의 작업을 실행 후 1월 2일의 작업을 실행하게 된다. 이 둘의 JobInstance는 다른 값이다.
JobParameters는 일괄 작업을 시작하는 데 사용되는 매개변수의 집합으로 Job과 JobInstance의 관계에서 하나의 JobInstance가 다른 JobInstance를 구별할 수 있게 해준다.
EndOfDay 작업을 예로 1월 1일에 대한 인스턴스와 1월 2일에 대한 인스턴스 두 개가 있는데 Job은 실제로 하나만 존재하지만 두 개의 JobParameter가 있다. 개발자는 전달되는 매개변수를 제어하여 JobInstance를 효과적으로 제어할 수 있다.
JobExecution은 작업을 실행하려는 단일 시도의 기술 개념이다. 실행은 실패와 성공으로 종료될 수 있지만 해당 실행에 해당하는 JobInstance는 실행이 성공적으로 완료되지 않으면 완료된 것으로 간주하지 않는다.
EndOfDay 작업을 예로 1월 1일의 작업 실행 중 오류가 발생하여 1월 2일에 오류가 발생한 1월 1일의 작업을 실행하는데 1월 2일에 실행되어야 할 순서와 꼬일 수 있다.
JobInstance는 별개의 인스턴스로 스프링 배치에서는 동시에 실행되는 것을 방지하지 않아 스케줄러의 도움을 받아 작업 실행 시기를 설정해야 한다.
Step은 배치 작업의 독립적이고 순차적인 단계를 캡슐화하는 도메인 개체이다. 따라서 모든 Job은 하나 이상의 단계로 구성된다. Step에는 일괄 처리를 정의하고 제어하는데 필요한 모든 정보가 포함되며, JobExecution에 대한 참조와 커밋 및 롤백 횟수, 시작 및 종료 시간과 같은 트랜잭션 관련 데이터가 포함된다.
List items = new Arraylist();
for (int i = 0; i < commitInterval; i++){
Object item = itemReader.read()
Object processedItem = itemProcessor.process(item);
items.add(processedItem);
}
itemWriter.write(items);
StepExecution은 단계를 실행하려는 단일 시도를 나타낸다. JobEexecution과 유사하게 Step이 실행될 때마다 새로운 StepExecution이 생성되고, 이전 단계가 실패하면 실행이 멈춘다.
//TODO
JobRepository는 JobLauncher, Jop, Step 구현을 위한 CRUD 작업을 제공한다.
작업이 처음 시작되면 저장소에서 JobExecution을 가져오며, 실행 과정에서 StepExecution 및 JobExecution 구현은 레포지토리에 전달되어 유지된다.
JobLauncher는 JobParameters 집합으로 Job을 시작하기 위한 간단한 인터페이스다.