WhatSprinb Batch 란?스케줄러와의 차이점필요한 시점핵심 동작원리용어 설명처리 메커니즘처리흐름 관점Job 정보의 흐름 관점스프링배치 저장 정보장단점한계WhyHow REFER
What
Sprinb Batch 란?
- 대량 데이터를 일괄적으로 처리 하기 위한 기술
스케줄러와의 차이점
Batch - 로직과 인프라 제공, Scheduling - 실생 시점 트리거 제공
사용의도가 다르다.
- Batch는 대량 데이터를 일괄적으로 처리하기 위한 기술이고, 스케줄러는 특정 시간이나 주기에 따라 작업을 실행하는 기술이다.
- 공식 문서에서도 공식 문서에서는 스케줄러를 대체하기 보다는 함께 작동하도록 설계 되어 있다. 라고 언급되어있으며 배치와 스케줄러는 아예 다른 것이 아니라 함께 사용해야하는 기술이다.
- Batch 는 어떻게 대량 데이터를 처리할 것인가에 초점이 있고, 스케줄러는 언제 실행할 것인가 라는 시점에 초첨이 맞쳐져있다.
- 이 둘을 활용하면 언제 대량 데이터를 일괄적으로 처리할 것인가로 활용될 수 있다.
Batch
역할
- 대량의 데이터를 효율적으로 처리하기 위한 비동기적 작업 처리 기술
특징
- 작업 단위를 Job과 Step으로 구성하여 관리함
- 트랜잭션 관리, 재시도, 오류 처리 등의 기능을 제공
- 작업의 상태 및 이력을 관리하여 중단된 작업의 재개가 가능합니다.
스케줄러
역할
- 특정 시간이나 주기에 따라 작업을 실행하는 기능을 제공합니다.
특징
- Cron 표현식 등을 사용하여 작업 실행 시점을 제어
- 작업의 실행 주기 관리에 초점
- Spring에서는 @Scheduled 어노테이션이나 Quartz와 같은 라이브러리를 사용
위 두가지 기술 중 고민이 있을 수 있는데, 이렇게 판단하는 것도 좋을것이라 생각한다.
- 조금 작은 양이라면 오히려 배치라는 복잡성있는 기술보다는 스케줄러로 간단하게 처리하는게 더 효율적일 수 있다.(취급하는 단위가 크다면 배치를, 작으면 스케줄러로)
- 체계적인 처리를 해야된다면 Batch를 간단한 처리라면 스케줄러로 하는 것이 효율적일 것이다.
- batch는 데이터를 처리하기 위해 몇단계로 나누어서 처리하도록 설계되고 제공
- Sucheduler는 이러한 단계는 따로 없어 개발자가 직접 만들어야 함
필요한 시점
- 주기적으로 대량 데이터를 처리하고자 할떄 (with 자동화)
- logging
- Business Data
- 체계적으로 대량 데이터를 처리하고 할 때,
- 단계적 처리 (추출, 변환, 적재)
- 트랜잭션(데이터 일관성을 보장하기 위한) 처리
- 실패 후 사후처리 - 작업 재시작
- 롤백처리 (건너뛰기)
- 데이터 마이그레이션
- 데이터베이스 간 대량 데이터 이동 및 변환
핵심 동작원리
[아키텍처]

Batch의 핵심은 바로 “읽고→처리(가공)하고→쓴다” 순차성이 존재한다는 것이다.

이 부분을 Job, Step, ItemReader, ItemProcessor, ItemWriter 로 나뉘어서 구분을 한다.
이로인해 데이터를 체계적으로 관리할 수 있게 되고 코드를 읽는 개발자에게도 좋은 가독성을 제공할 수 있다.
용어 설명
Job과 Step
- Job: 하나이상의 Step으로 구성된 단위
- Step : 실제 작업이 수행되는 단위 (독립적 처리 단계를 의미)
- 처리 방법의 종류
- 단순 단일 작업 처리를 위한 방식(TaskletStep)
- 대량 데이터를 청크 기반으로 쪼개어 조금씩 처리(데이터를 쪼개어서 처리하는 방식)하는 방식
청크 기반 처리
- 읽고 ⇒ 가공 ⇒ 쓴다
- 장점: 효율적인 메모리 사용과 트랜잭션 관리가 가능하고 이로 인해 성능향상을 도모할 수 있다.
트랜잭션 관리
- 각 청크는 하나의 트랜잭션으로 관리되어 진다.
- 청크 내에 예외 발생시 모든 작업이 롤백된다.
- 재시도 및 스킵 기능을 통해 오류 발생시 유연하게 대응이 가능하다.
메타데이터 관리
- 실행상태와 이력을 메타데이터 테이블로 저장한다.
- 이를 통해 작업 재시도, 재시작, 모니터링이 가능하다.
- 주요 메타데이터 테이블: BATCH_JOB_INSTANCE BATCH_JOB_EXECUTION BATCH_STEP_EXECUTION
실제로도 이 메타 정보가 라이브러리에 포함되는 걸 볼 수 있다.


처리 메커니즘

처리흐름 관점
- JobScheduler 가 배치를 트리거링 하면 JobLauncher 를 실행한다.
- JobLauncher 는 Job을 실행한다. 이때 JobExecution 을 수행하고, Execution Context 정보를 이용한다.
- Job은 자신에게 정으된 Step을 실행한다. 이때 StepExecution을 수행하고, Execution Context 정보가 전달되어 수행된다.
- Step은 Tasklet과 Chunk모델을 가지고 있으며 위 그림에서는 Chunk 모델로 수행되게 된다.
- Chunk 모델은 ItemReader를 통해서 소스 데이터를 읽어 들인다.
- ItemProcessor를 통해서 읽어들인 청크단위 데이터를 처리한다. 처리는 데이터를 변환하거나 가공하는 역할을 하게 된다.
- ItemWriter는 처리된 청크 데이터를 쓰기작업한다. 다양한 Writer를 통해 데이터베이스에 저장하거나, 파일로 쓰는 역할을 하게 된다.
Job 정보의 흐름 관점
- JobLauncher는 JobRepository를 통해서 JobInstance정보를 데이터베이스에 등록한다.
- JobLauncher는 JobRepository를 통해서 Job Execution 을 통해 Job 수행하고 실행 정보를 데이터베이스에 저장한다.
- JobStep은 JobRepository를 통해서 I/O 레코드와 상태정보를 저장한다.
- 잡이 완료되면 JobRepository를 통해서 데이터베이스에 완료 정보를 저장한다.
스프링배치 저장 정보
- JobInstance
- JobInstance는 잡 이름과 전달 파라미터를 정의한다.
- Job이 중단되는 경우 다음 실행할때 중단 이후부터 실행하도록 지원한다.
- Job이 재실행을 지원하지 않는경우, 혹은 성공적으로 처리된 경우 배치를 재실행 한다면 중복 수행되지 않도록 종료한다.
- JobExecution / ExecutionContext
- JobExecution
- JobExecution은 잡의 물리적인 실행을 나타낸다.
- JobInstance와 달리 동일한 Job이 여러번 수행될 수 있다.
- 그러므로 JobInstance 와 JobExecution은 1:N 관계가 된다.
- ExecutionContext
- ExecutionContext는 각각의 JobExecution 에서 처리 단계와 같은 메타 정보들을 공유하는 영역이다.
- ExecutionContext는 주로 스프링배치가 프레임워크 상태를 기록하는데 사용하며, 또한 애플리케이션에서 ExecutionContext에 액세스 하는 수단도 제공된다.
- ExecutionContext에 저장되는 객체는 java.io.Serialized를 구현하는 클래스이어야 한다.
- StepExecution / ExecutionContext
- StepExecution
- StepExecution은 Step을 물리적인 실행을 나타낸다.
- Job은 여러 Step을 수행하므로 1:N 관계가 된다.
- ExecutionContext
- Step내부에 데이터를 공유해야하는 공유 영역이다.
- 데이터의 지역화 관점에서 여러 단계에 공유 할 필요가 없는 정보는 Job내 ExecutionContext를 이용하는 대신에, Step 단계 내의 ExecutionContext를 사용해야한다.
- StepExecutionContext에 저장되는 데이터는 반드시 java.io.Serializable 를 구현해야한다.
- JobRepository
- JobExecution과 StepExecution등과 같이 배치 실행정보나 상태, 결과정보들이 데이터베이스에 저장될 필요가 있으며 이를 처리하는 것이 JobRepository이다.
- 즉 스프링배치를 수행하기 위해서 이를 저장할 데이터베이스가 필요하다.
- 이렇게 저장된 정보를 활용하여 스프링배치는 배치 잡을 재실행 하거나, 정지된 상태 후부터 수행할 수 있는 수단을 제공하게 된다.
장단점
장점
- 효율적인 자원활용
- 대량데이터를 일괄 처리하여 시스템 부하를 낮출 수 있다.
- 신뢰성
- 트랜잭션 관리와 오류 복구 기능을 제공하여 데이터 일관성있게 처리 가능하다
- 유연성
- 하나의 작업(JOB)을 여러 단계(Step) 으로 나누어서 처리할 수 있다.
- 확장성
- 병렬 처리 및 분산처리 기능 또한 제공하여 성능을 향상시킬 수 있다.
- 풍부한 기능 제공
- 로그 추적, 재시도, 스킵, 청크 처리 등 다양한 기능을 제공한다.
단점
- 러닝 커브가 존재하여 복잡성이 존재한다.
- 실시간 처리 부적합하다.
- 비동기 처리로 인해 디버깅에 어려움이 있다.
한계
- 실시간성 부족
- 복잡한 설정
- 메모리 사용량 문제 발생 여지 충분
- 의존성
Batch 사용시 주의사항
- 트랜잭션 처리
- 청크 사이즈
- 예외 처리 전략
- 성능 최적화
- 리소스 관리
- 로그 및 모니터링
Why
- 대량 데이터를 일괄적으로 처리함으로써 복잡한 비즈니스 성 대량 데이터를 손쉽게 처리가 가능하다.
- 한번 처리하는 코드를 작성하면 인적 낭비를 줄일 수 있다. (with 자동화)
- 또한 이런 데이터를 단계적으로 처리함으로써 유지보수성 또한 뛰어나며 가독성 측면의 향상또한 증가한다.
How
feat: spring batch 기본 튜토리얼