배치는 “해야 할 작업(Job/Step)을 정의하는 프레임워크”이고, 그 작업을 “언제 실행할지 트리거를 거는 역할”은 스케줄러가 맡는 경우가 많다. 그래서 실무에서는 Spring Batch(작업 정의) + Spring Scheduler(실행 트리거) 조합을 자주 쓴다.
배치(Batch)는 대량의 데이터를 일정한 규칙에 따라 자동 처리하는 프로세스다. 보통 사용자의 요청 없이 정해진 시점(예: 매일 밤 2시)이나 트리거에 의해 실행된다.
주 사용 목적은 다음과 같다.
예시로는 아래 같은 작업들이 대표적이다.
자주 하는 오해가 “배치가 곧 스케줄러다”인데, 둘은 역할이 다르다.
즉, Job에다가 처리 단계를 구성해두고, 스케줄러가 정해진 시간에 Job을 실행해주는 구조다. 이때 스케줄러가 배치를 실행하려면 JobLauncher와 실행할 Job에 대한 의존성이 필요하다.
아래 코드는 “1분마다” 배치 Job을 실행하는 스케줄러 예시다. 핵심은 jobLauncher.run(job, jobParameters)로 Job을 실행하는 부분이고, 매 실행마다 JobParameters를 바꿔주는(여기서는 time) 이유는 같은 파라미터로 실행하면 “이미 실행된 Job 인스턴스”로 판단되어 실행이 막힐 수 있기 때문이다.
package com.beyond.basic.b2_board.post.service;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class PostBatchScheduler {
private final JobLauncher jobLauncher;
private final Job job;
@Autowired
public PostBatchScheduler(JobLauncher jobLauncher, Job job) {
this.jobLauncher = jobLauncher;
this.job = job;
}
@Scheduled(cron = "0 0/1 * * * *")
public void batchScheduler() {
try {
JobParameters jobParameters = new JobParametersBuilder()
.addLong("time", System.currentTimeMillis()) // 시스템 시간을 이용하여
.toJobParameters();
jobLauncher.run(job, jobParameters);
} catch (Exception e) {
e.printStackTrace();
}
}
}
운영 관점에서는 printStackTrace() 대신 로깅으로 남기고(실패 원인 추적), 실패 케이스에 대한 정책(재시도/알림/중단)을 같이 설계하는 게 일반적이다.
Spring Batch에서 작업은 보통 Job과 Step으로 구성된다.
Job: 전체 배치 프로세스(“오늘 정산 배치” 같은 큰 단위)Step: Job 안의 개별 단계(“데이터 조회 → 가공 → 저장” 중 한 단계)Step을 구현하는 방식은 크게 두 가지로 많이 설명한다.
단일 단계를 “한 번에 실행되는 작업”으로 정의하는 방식이다. 로직이 단순한 정리 작업(상태 변경, 만료 처리)처럼 “한 방에 끝나는 처리”에 잘 맞는다.
대량 데이터를 효율적으로 처리하기 위한 방식이다. 정해진 chunk 단위로 읽고 처리하고 쓰면서, 메모리/트랜잭션 부담을 줄인다.
배치 작업을 도입할 때는 보통 다음 순서로 진행한다.
spring-boot-starter-batch 의존성 추가schema-mariadb.sql 실행 필요)배치 메타 테이블은 Job 실행 이력, 성공/실패, 재시도 여부 같은 “운영에 필요한 상태”를 관리하기 때문에 필수다.
둘의 차이를 문장으로 딱 정리하면 이렇다.
특히 배치 작업은 시작/종료 시점이 명확하고 실행 시간이 길 수 있으며, 대규모 처리에서 신뢰성을 확보하기 위해 재시도 및 오류 처리 메커니즘을 제공한다는 점이 스케줄러 단독 구현과 가장 큰 차이로 자주 언급된다.