Spring Batch vs Spring Scheduler: 무엇이 다르고 언제 써야 할까?

안녕하세요, Code Camp입니다.

개발자 커뮤니티에서 가장 많이 나오는 질문 중 하나가 바로 이겁니다.

“그냥 @Scheduled 써서 매일 돌리면 되는데, 굳이 복잡하게 Spring Batch를 써야 하나요?”

정말 좋은 질문입니다. 결론부터 말씀드리면, 둘은 목적 자체가 다릅니다.
오늘 이 글을 읽고 나면, 언제 무엇을 선택해야 할지 확실한 기준을 갖게 되실 겁니다.


목차

  1. 한 문장 정리
  2. Spring Scheduler: 시간표 알람
  3. Spring Batch: 대용량 작업 공장
  4. 상세 비교표 (Table)
  5. 결론: 최적의 조합은?

1. 한 문장 정리

  • Spring Scheduler: “매일 아침 9시에 이 메소드를 실행해줘!” (시간에 초점)
  • Spring Batch: “이 100만 건의 데이터를 안정적으로 처리해줘!” (데이터 처리에 초점)

2. Spring Scheduler: 시간표 알람

Spring Framework에 기본 내장된 스케줄러입니다. 별도의 의존성 추가 없이 @Scheduled 어노테이션만 붙이면 됩니다.

장점

  • 설정이 매우 간단합니다.
  • Cron 표현식을 지원하여 복잡한 시간 설정이 가능합니다.

단점

  • 상태 관리가 안 됩니다: 작업이 실패해도 어디서 실패했는지, 재시작은 어떻게 할지 스스로 알지 못합니다.
  • 클러스터링 미지원: 서버가 여러 대면 모든 서버에서 스케줄러가 동시에 실행되어 중복 처리가 발생할 수 있습니다. (ShedLock 등으로 해결해야 함)
// 간단한 스케줄러
@Scheduled(cron = "0 0 9 * * *")
public void run() {
    System.out.println("매일 아침 9시 실행!");
}

3. Spring Batch: 대용량 작업 공장

앞선 포스팅에서 배웠듯이, 대용량 데이터를 처리하기 위해 탄생한 프레임워크입니다.
중요한 점은 Spring Batch는 ‘스케줄링’ 기능이 없다는 것입니다.

Spring Batch는 혼자서 특정 시간에 실행되지 않습니다. 누군가(Jenkins, Airflow, 심지어 Spring Scheduler)가 “야, 지금 시작해!” 라고 깨워줘야 합니다.

장점

  • 대용량 데이터 처리에 최적화 (Chunk).
  • 실패 시 재시작(Restart) 지원.
  • 실행 이력 기록 (JobHistory).

4. 상세 비교표 (Table)

특징Spring SchedulerSpring Batch
주목적정해진 시간에 코드 실행대용량 데이터 일괄 처리
실행 주체스스로 실행 (Timer)외부에서 실행 요청 필요
복잡도매우 낮음높음 (Job, Step, Reader…)
트랜잭션개발자가 직접 관리Chunk 단위 자동 관리
실패 복구지원 안 함 (처음부터 다시)실패 지점부터 재시작 가능
사용 예시매분 하트비트 전송, 캐시 갱신월 정산, 데이터 마이그레이션

5. 결론: 최적의 조합은?

가장 이상적인 아키텍처는 둘을 함께 사용하는 것입니다.

  1. Spring Scheduler는 “트리거(Trigger)” 역할만 합니다. “지금 몇 시니까 Job을 실행해!”라고 명령만 내립니다.
  2. 실제 무거운 작업은 Spring Batch가 수행합니다.
@Component
@RequiredArgsConstructor
public class BatchScheduler {

    private final JobLauncher jobLauncher;
    private final Job dailyJob;

    @Scheduled(cron = "0 0 0 * * *") // 매일 자정
    public void runJob() {
        // Scheduler가 Batch를 실행시킴
        jobLauncher.run(dailyJob, new JobParameters(...));
    }
}

이렇게 하면 스케줄링의 편리함과 배치의 안정성을 모두 가져갈 수 있습니다.


이 글들이 여러분의 백엔드 개발 여정에 작은 나침반이 되었기를 바랍니다. 지금까지 Code Camp였습니다. 감사합니다!

관련 글 보기