728x90
Spring Scheduler 란?
Spring Framework에서 제공하는 작업 스케줄링 기능으로, 일정 시간마다 또는 특정 시점에 어떤 작업을 자동으로 실행하도록 설정할 수 있음.
복잡한 설정 없이 간단한 주기적 작업을 구현할 수 있어 백그라운드 처리나 정기적인 작업에 자주 사용됨.
- 주로 @Scheduled 어노테이션을 이용해 메서드를 주기적으로 실행함.
- 내부적으로는 TaskScheduler와 ScheduledExecutorService를 사용하여 동작함.
- 크론 표현식, fixedDelay, fixedRate, initialDelay 등을 통해 세부 설정 가능.
Spring Batch vs Spring Scheduler
목적 | 정기적인 간단한 작업 실행 | 대용량 배치 작업 처리에 특화 |
사용 사례 | 로그 정리, 정기 API 호출 | 정산, 데이터 마이그레이션, ETL |
복잡도 | 매우 단순 | 구조적으로 복잡 (Job, Step 등 필요) |
트랜잭션 처리 | 없음 (수동으로 해야 함) | 트랜잭션 관리 내장 |
스케줄링 | @Scheduled 기반 | 별도 스케줄링 설정 필요 (Quartz 등과 연동) |
병렬 처리 | ThreadPool 직접 설정 | 병렬 Step 및 Partition 처리 지원 |
➡ 간단한 주기적 작업이면 Spring Scheduler
➡ 대량의 데이터 처리가 필요한 경우 Spring Batch 사용
Spring Scheduler 주요 클래스 & 어노테이션
1. @EnableScheduling
Spring에서 스케줄링 기능을 활성화할 때 사용하는 어노테이션
@Scheduled가 붙은 메서드를 감지하고 실행할 수 있도록 한다.
해당 어노테이션이 없으면 스케줄이 동작하지 않으며 보통 @Configuration 과 같이 사용한다.
@Configuration
@EnableScheduling
class SchedulerConfig
2. @Scheduled
스케줄링할 메서드 위에 붙여 주기적 실행 조건을 명시하며 크론 표현식, 고정 지연 시간, 고정 속도 등을 지원한다.
// cron : 정해진 시간에 실행
@Scheduled(cron = "0 0 3 * * *")
fun cronScheduler() {
println("매일 3시에 실행")
}
// fixedRate : 이전 작업 시작 후 일정 시간마다 실행
@Scheduled(fixedRate = 10_000)
fun fixedRateScheduler() {
println("작업 시작 시점 기준으로 10초마다 반복")
}
// fixedDelay : 이전 작업 종료 후 일정 시간마다 실행
@Scheduled(fixedDelay = 10_000)
fun fixedDelayScheduler() {
println("작업 종료 후 기준 10초마다 반복")
}
// initialDelay : 시작 대기 시간 설정
@Scheduled(initialDelay = 5_000, fixedRate = 10_000)
fun initialDelayScheduler() {
println("앱 시작 후 5초 대기 → 10초 간격 실행")
}
3. SchedulingConfigurer
스케줄링 동작을 커스터마이징할 수 있는 인터페이스.
스케줄링 설정을 프로그래밍 방식으로 조절하고, ThreadPoolTaskScheduler와 연동 가능.
- 스케줄링에 사용할 스레드 풀 지정 가능
- 여러 작업이 동시에 실행되도록 설정 가능
4. ThreadPoolTaskScheduler
멀티 스레드 기반으로 작업을 병렬 실행할 수 있게 해주는 스케줄러 구현체.
스케줄러의 백그라운드 스레드 수, 이름 등을 설정할 수 있음.
@Bean
fun taskScheduler(): ThreadPoolTaskScheduler {
return ThreadPoolTaskScheduler().apply {
poolSize = 10
threadNamePrefix = "MyScheduler-"
initialize()
}
}
- SchedulingConfigurer에서 주로 사용
- 병렬 실행, 지연 실행 등에 유용
5. ScheduledTaskRegistrar
스케줄링할 작업을 등록하고 실행을 관리하는 핵심 클래스.
SchedulingConfigurer.configureTasks()에서 전달받아 설정에 사용됨.
- 내부적으로 Runnable, Trigger, TaskScheduler를 관리
- 직접 사용할 일은 거의 없지만, 커스터마이징 시 중요한 역할을 함
Spring Scheduler 구현
1. Scheduler Application
@SpringBootApplication(exclude = [DataSourceAutoConfiguration::class])
@ConfigurationPropertiesScan
@EnableWebFlux
class SchedulerApplication
fun main(args: Array<String>) {
runApplication<SchedulerApplication>(*args)
}
2. Scheduler Config
@Configuration
@EnableScheduling
class SchedulerConfig : SchedulingConfigurer {
@Bean
fun taskScheduler(): ThreadPoolTaskScheduler {
return ThreadPoolTaskScheduler().apply {
this.poolSize = 10
this.setThreadNamePrefix("scheduled-task-")
}
}
override fun configureTasks(taskRegistrar: ScheduledTaskRegistrar) {
taskRegistrar.setScheduler(taskScheduler())
}
}
3. Scheduler
@Component
class MyScheduler(
private val mySerivce: MyService,
) {
@Scheduled(fixedDelayString = "5000")
fun myScheduler() {
log.info("my scheduler start")
myService.serve()
log.info("my scheduler end")
}
}
728x90
'Spring' 카테고리의 다른 글
[Spring] Shedlock 을 통한 Spring Scheduler 제어 (1) | 2025.07.12 |
---|---|
Spring Batch란? (0) | 2022.03.22 |
[Spring] Spring의 Event 처리 과정 (0) | 2022.03.15 |
Spring 면접 질문 모음 (0) | 2021.11.21 |
스프링 핵심 원리 (0) | 2021.11.11 |