들어가며

  • 이번 프로젝트에서 맡게 된 문자 기능의 요구사항으로 특정 시간에 자동으로 고객에게 문자를 발송하기가 있었습니다. 이 기능을 구현하면서 Spring boot에서 주기적으로 일정한 기능을 실행하도록 구현하는데에 여러 방법이 있다는걸 알게되었는데요, 이 글에서는 Scheduled, Spring Batch를 비교하며 각각의 특징을 간단하게 소개하려고 합니다 🙂

1. @Scheduled (Spring 기본 스케줄링)

Spring Boot에서 기본 제공하는 스케줄링 기능으로, 간단한 주기적 작업을 처리할 때 유용합니다.
애플리케이션이 실행 중일 때만 동작하며, 단순한 반복 작업을 수행합니다.

특징

  • @Scheduled(cron = "...")을 활용하여 간단하게 특정 시간에 주기적 작업 실행 가능
  • 애플리케이션이 실행 중일 때만 동작 → 분산 환경 지원 X
  • 기본적으로 단일 스레드에서 실행 됨, 여러 작업을 효율적으로 관리하기 어려움

사용 예시

@Scheduled(cron = "0 0 9 * * ?") // 매일 오전 9시에 실행
public void sendScheduledMessages() {
    System.out.println("문자 발송 스케줄 실행!");
}

여기서 cron ...Cron 표현식으로, 의미는 아래와 같아요.

┌───────────── 초 (0-59) → Spring에서는 생략 가능
│ ┌─────────── 분 (0-59)
│ │ ┌───────── 시 (0-23)
│ │ │ ┌─────── 일 (1-31)
│ │ │ │ ┌───── 월 (1-12)
│ │ │ │ │ ┌─── 요일 (0-7, 0과 7은 일요일)
│ │ │ │ │ │
│ │ │ │ │ │
0  0  9  *  *  ?

별도 시간대를 지정하지 않으면 서버의 기본 시간대를 사용합니다.

@Scheduled(cron = "0 0 9 * * ?", zone = "UTC") // UTC 기준으로 실행
public void sendScheduledMessages() {
    System.out.println("UTC 기준 매일 9시 문자 발송 스케줄 실행!");
}

유의 사항

  • Spring Boot에서 @Scheduled을 사용하려면 @EnableScheduling이 활성화되어 있어야 합니다. 활성화는 @SpringBootApplication 또는 @Configuration 클래스에 @EnableScheduling을 추가하면 됩니다.
@SpringBootApplication
@EnableScheduling // 반드시 추가해야 함!
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

2. Spring Batch (대량 데이터의 효율적인 처리를 위한 프레임워크)

Spring Batch는 대량 데이터를 효율적으로 처리할 수 있는 프레임워크로, 수천~수만 개의 데이터를 주기적으로 처리해야 할 때나 고성능 대량 데이터 처리 작업이 필요할 때 사용할 수 있어요.

의존성 추가

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-batch'
    implementation 'org.springframework.batch:spring-batch-core'
}

application.yml 설정

spring:
  batch:
    job:
      enabled: false # 실행 시 batch 자동 실행 끄기
    jdbc:
      initialize-schema: embedded # 배치 테이블을 자동 생성할지 여부
      isolation-level-for-create: default # 트랜잭션 격리 수준 설정
      table-prefix: BATCH_ # 배치 관련 테이블의 접두어 설정 (ex: BATCH_JOB_INSTANCE)
    datasource: ...

더 많은 옵션은 공식 문서를 참고해주세요 🔎

Spring batch는 1번에서 설명한 스케줄링과 같이 사용이 가능합니다. @ScheduledSpring Batch 모두 반복적인 작업을 실행하는 기능을 제공하지만, 목적과 방식에서 차이점이 있어요.

기능 @Scheduled Spring Batch
목적 단순한 반복 작업 스케줄링 대량 데이터 처리 (읽기→가공→저장)
데이터 처리 단일 작업 실행 배치(Chunk) 단위로 실행
트랜잭션 관리 없음 트랜잭션 기반 처리 가능
실행 방식 @Scheduled으로 주기적으로 실행 잡(Job) 기반 실행 (Step, Reader, Processor, Writer 포함)
재시도 기능 없음 (실패 시 재실행 불가) 재시도(Retry), 오류 복구 가능
멀티 스레드 지원 여부 기본적으로 단일 스레드 병렬 처리 가능 (여러 개의 Step을 동시에 실행)

마무리

제가 구현한 문자 발송 기능의 경우, 문자 수신자가 여러명이여도 한 번의 api만 호출하면 되는 등 비교적 단순한 로직이라고 생각해서 @Scheduled 방식을 채택했습니다. 하지만 만약 더 복잡한 기능이거나 많은 데이터를 처리해야 했다면 Spring batch 사용을 고려했을 것 같아요. 이런 기능에 관심이 있으신 분들은 spring quartz에 대해서도 찾아보시면 도움이 될 것 같습니다!