Framework/Spring
[Batch] 배치 애플리케이션의 이해와 Spring Batch 기본 활용법
Joonfluence
2024. 11. 24. 22:59
1. 배치의 정의
배치(Batch)는 대량의 데이터를 정기적이고 반복적으로 처리하는 프로그램입니다. 주로 사용자가 없는 새벽 시간대에 실행되며, 대규모 데이터의 처리, 집계, 변환 등 비즈니스 로직을 실행하는 데 활용됩니다.
2. 배치 애플리케이션이 필요한 이유
2.1 WAS와 배치의 구분- WAS (Web Application Server)는 사용자 요청을 실시간으로 처리하는 서버입니다.
- 하지만 배치와 같이 대규모 데이터를 처리하거나 비즈니스 로직을 길게 실행해야 하는 작업은 WAS에서 실행하기 적합하지 않습니다.
주요 이유는 다음과 같습니다:- 성능 문제: 실시간 요청을 처리하는 서버에서 대량 데이터 작업을 수행하면, 응답 속도가 느려져 사용자 경험이 저하됩니다.
- 안정성 문제: 장시간 실행되는 작업은 서버 부하를 유발하거나 실패 시 서비스 장애로 이어질 수 있습니다.
- 스케줄링 필요: 배치는 정해진 시간에 주기적으로 실행되므로 스케줄링이 필요합니다.
- 커머스 사이트의 매출 집계: 하루 50만~100만 건의 거래 데이터를 실시간으로 조회하려면 서버 부하가 큽니다. 대신, 새벽에 전날 데이터를 집계해 미리 저장해두고 요청 시 바로 제공하면 성능을 최적화할 수 있습니다.
- ERP 데이터 전송: 사내 데이터와 외부 시스템 간 연동 작업을 일정 주기로 처리 할 때, 사용하기도 합니다.
3. Spring Batch와 다른 스케줄링 기술의 차이점
기술 | Spring Batch | Spring Scheduler | Spring Quartz |
주요 목적 | 대규모 데이터 처리 및 워크플로 관리 | 단순한 반복 작업 관리 | 고급 스케줄링 및 작업 의존성 관리 |
구성 요소 | Job, Step, Reader, Processor, Writer | @Scheduled 어노테이션 | Job, Trigger |
상태 관리 | 지원 (Job Execution 상태 기록) | 미지원 | 지원 (Persistent Job Store 활용 시) |
분산 처리 | 기본 지원 | 미지원 | 클러스터링 지원 |
적용 사례 | 대규모 배치 작업, 데이터 처리 파이프라인 | 간단한 반복 작업 | 복잡한 스케줄링, 분산 환경 작업 |
4. Spring Batch의 구성 요소
Spring Batch는 데이터를 읽고, 처리하고, 저장하는 작업을 단계적으로 수행합니다.
- Tasklet: 단일 작업을 실행하는 로직
- ItemReader: 데이터를 읽어오는 역할 (e.g., 데이터베이스, 파일)
- ItemProcessor: 읽어온 데이터를 가공, 변환
- ItemWriter: 처리된 데이터를 저장 (e.g., 데이터베이스, 파일)
- Job: 여러 개의 Step을 포함하며 배치의 최상위 개념
- Step: Tasklet 또는 Reader-Processor-Writer로 구성된 단위 작업
5. Spring Batch의 메타 테이블
Spring Batch는 실행 상태와 결과를 메타 테이블에 저장해 관리합니다.
이 메타 테이블들은 자동으로 생성되며 작업의 상태 추적 및 재시도를 가능하게 합니다.
- BATCH_JOB_INSTANCE: Job의 인스턴스 정보
- BATCH_JOB_EXECUTION: 실행된 Job의 시작 및 종료 시간, 상태 정보
- BATCH_STEP_EXECUTION: Step의 실행 정보
6. Spring Batch와 스케줄링 기술의 결합
Spring Batch는 배치를 정의하는 데 사용되며, Spring Scheduler 또는 Spring Quartz와 결합해 정해진 시간에 배치를 실행할 수 있습니다.
예시 코드: Spring Batch + Spring Scheduler@Component
public class SchedulerConfig {
@Scheduled(cron = "0 0 1 * * ?") // 매일 새벽 1시 실행
public void runBatchJob() {
JobParameters jobParameters = new JobParametersBuilder()
.addLong("time", System.currentTimeMillis())
.toJobParameters();
try {
jobLauncher.run(batchJob, jobParameters);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Configuration
public class QuartzConfig {
@Bean
public JobDetail batchJobDetail() {
return JobBuilder.newJob(QuartzBatchLauncher.class)
.storeDurably()
.build();
}
@Bean
public Trigger batchJobTrigger() {
return TriggerBuilder.newTrigger()
.forJob(batchJobDetail())
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 1 * * ?"))
.build();
}
}
@Component
public class QuartzBatchLauncher implements Job {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job batchJob;
@Override
public void execute(JobExecutionContext context) {
JobParameters jobParameters = new JobParametersBuilder()
.addLong("time", System.currentTimeMillis())
.toJobParameters();
try {
jobLauncher.run(batchJob, jobParameters);
} catch (Exception e) {
e.printStackTrace();
}
}
}
7. Batch 실행 흐름 컨트롤: Next, Flow, Decide
Spring Batch는 작업의 흐름을 세밀하게 제어할 수 있습니다.
- Next: 순차적으로 Step 연결
.start(stepA)
.next(stepB)
.build();
- Flow: 오류가 발생할 경우 특정 Step으로 분기
.from(stepA).on("FAILED").to(stepC)
.from(stepA).on("*").to(stepB)
- Decide: 조건에 따라 다양한 분기 처리
.from(stepA).next(decisionStep).on("CONDITION_1").to(stepB)
.from(decisionStep).on("CONDITION_2").to(stepC)
결론
Spring Batch는 대규모 데이터를 효율적으로 처리하기 위한 강력한 도구이며, 스케줄링 기술(Spring Scheduler, Quartz)과 결합해 실무에 적합한 배치 시스템을 구축할 수 있습니다.
반응형