[Spring Batch 정리하기] 1. Spring Batch 개요
이전 글에서 스프링 배치를 처음 접하고 간단하게 정리한 적이 있습니다.
최근에 스프링배치 장애해결을 위해 강의를 들었는데 이를 간략하게 주로 사용한 부분 위주로 정리하고자 합니다.
(이전 글들과 중복된 내용이 있을 수 있습니다.)
1. Spring Batch 소개
- Spring Batch(스프링배치)는 엔터프라이즈 시스템의 일상적인 운영에 필수적인 강력한 Batch Application 개발을 가능하게 하도록 설계된 경량급 포괄적인 배치 프레임워크.
- Spring Batch 는 로깅/추적, 트랜잭션 관리, Job 처리 전략, Job Restart, Skip, Retry, 리소스 관리 등 대용량 데이터 처리에 필수적인 재사용 가능한 기능을 제공.
- 최적화 및 파티셔닝 기술을 통해 대용량 및 고성능 배치 작업이 가능.
- 배치가 실패하여 작업 재시작을 하게 되면 처음부터가 아닌 실패한 지점부터 재실행.
- But, 중복 실행을 막기 위해 성공한 이력이 있는 Batch 는 동일한 Parameters 로 실행 시 Exception 이 발생하며 중복 실행 불가능.
1-1) Spring Batch VS Quartz, Scheduler
- Spring Batch 는 Scheduler 가 아니다.
- Spring Batch 는 Batch Job 을 제공하고 관리하지만, 실질적으로 이 Job 을 구동하거나 실행시키는 기능은 지원하지 않는다.
- 해당 Batch Job 을 실행시키기 위해 Quartz, Scheduler 등 전용 Scheduler 를 사용한다.
// 스케줄 사용 유무 및 실행 인스턴스 확인
@Scheduled(cron="0 0 5 0 0 *")
public void allScheduled() {
...
}
2. Spring Batch 사용 시나리오
2-1) 배치 핵심 패턴
- Spring Batch 는 아래와 같은 기본 배치 반복을 자동화하여 사용자의 상호 작용 없이 오프라인 환경에서 유사한 트랜잭션을 처리할 수 있는 기능을 제공한다.
- Read : 데이터베이서, 파일, 큐 등에서 다량의 데이터 조회
- Process : 특정 방법으로 데이터를 가공
- Write : 데이터를 수정된 양식으로 다시 저장
2-2) 배치 비지니스 시나리오
- 배치 프로세스를 주기적으로 커밋
- 동시 다발적인 Job 의 배치 처리, 대용량 병렬 처리
- 실패 후 수동 또는 스케줄링에 의한 재시작
- 의존관계가 있는 Step 여러 개를 순차적으로 처리
- 조건적 FLow 구성을 통한 체계적이고 유연한 배치 모델 구성
- 반복, 재시도, Skip 처리
2-3) Spring Batch Architecture
- 기본 구조
- 배치 수행 구조
- 조금 더 쉽게 이해하기 위해 controller, service, dao 3-tier를 빗대어 생각해 보았습니다.(주관적입니다!!!)
- Run Tier
- Application 의 Scheduling.
- 실행을 담당.
- Spring Batch 는 따로 Scheduling 기능을 제공하지 않고, Quartz 나 Cron 을 이용하도록 권고. - Job Tier
- 전체적인 Job 의 수행을 책임.
- Job 내의 각 Step 을 정책에 따라 순차적으로 수행.
- 3-tier 중 Controller(요청을 전달받아 Job 호출). - Applictaion Tier
- Job 을 수행하는데 필요한 Component.
- 3-tier 중 Service(Job을 실행하여 요청 처리). - Data Tier
- Database, Queue 등 물리적 데이터 소스.
- 3-tier 중 Dao(Job 실행 중 데이터 관련 처리).
- 스프링 배치 구성 요소
- JobLauncher
- JobLauncher 는 배치 Job 을 실행시키는 역할.
- Job 과 JobParameter 를 받아 실행하고, JobExcution 을 반환.
public interface JobLauncher {
public JobExecution run(Job job, JobParameters jobParameters) throws JobExecutionAlreadyRunningException,
JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException;
}
- Job
- 배치에서 실행하고자 하는 작업
- 전체 배치 프로세스를 캡슐화한 도메인
- 논리적인 Job 실행의 개념
- Job Configuration 과 대용되는 단위
- Step 의 순서 정의
- Batch 작업을 실행할 때 필요한 데이터를 파라미터(JobParameters) 로 받아 수행(Optional)
public interface Job {
// Job 의 이름
String getName();
// 재시작 가능 여부
boolean isRestartable();
// Job 실행
void execute(JobExecution execution);
@Nullable
JobParametersIncrementer getJobParametersIncrementer();
JobParametersValidator getJobParametersValidator();
}
- Step
- Job 을 구성하는 독립적인 하나의 단계
- Job 과 Step 은 1:N 관계
- 배치 작업의 독립적이고 순차적인 단계를 캡슐화하고, 실제 배치 처리에 대한 정의 및 제어하는데 필요한 모든 정보를 포함하는 도메인 객체
- Chunk-Oriented / Tasklet 처리 방식이 존재
public interface Step {
String getName();
boolean isAllowStartIfComplete();
int getStartLimit();
void execute(StepExecution stepExecution) throws JobInterruptedException;
}
JobRepository
- 수행되는 Job에 대한 정보를 담고 있는 저장소.
- 특정 Job 에 대한 수행 시간, 횟수, 결과 등 Batch 수행과 관련된 Meta Data 가 저장.
참고
- https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98/dashboard