들어가며
- 이번 프로젝트에서 맡게 된 문자 기능의 요구사항으로 특정 시간에 자동으로 고객에게 문자를 발송하기가 있었습니다. 이 기능을 구현하면서 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번에서 설명한 스케줄링과 같이 사용이 가능합니다.
@Scheduled
과 Spring Batch
모두 반복적인 작업을 실행하는 기능을 제공하지만, 목적과 방식에서 차이점이 있어요.
기능 | @Scheduled | Spring Batch |
---|---|---|
목적 | 단순한 반복 작업 스케줄링 | 대량 데이터 처리 (읽기→가공→저장) |
데이터 처리 | 단일 작업 실행 | 배치(Chunk) 단위로 실행 |
트랜잭션 관리 | 없음 | 트랜잭션 기반 처리 가능 |
실행 방식 | @Scheduled으로 주기적으로 실행 | 잡(Job) 기반 실행 (Step, Reader, Processor, Writer 포함) |
재시도 기능 | 없음 (실패 시 재실행 불가) | 재시도(Retry), 오류 복구 가능 |
멀티 스레드 지원 여부 | 기본적으로 단일 스레드 | 병렬 처리 가능 (여러 개의 Step을 동시에 실행) |
마무리
제가 구현한 문자 발송 기능의 경우, 문자 수신자가 여러명이여도 한 번의 api만 호출하면 되는 등 비교적 단순한 로직이라고 생각해서 @Scheduled
방식을 채택했습니다.
하지만 만약 더 복잡한 기능이거나 많은 데이터를 처리해야 했다면 Spring batch
사용을 고려했을 것 같아요. 이런 기능에 관심이 있으신 분들은 spring quartz에 대해서도 찾아보시면 도움이 될 것 같습니다!