구현하기 바빠서 넘어간 부분들을 조금이라도 정리해보고자 쓰는 TIL 시리즈입니다
Spring Boot에서 스케줄링을 구현하는 주요 방식들에 대해 정리해보자.
Spring Boot에서 스케줄링을 구현하는 방법은 여러 가지가 있지만, 실제로 가장 많이 사용되는 것은 @Scheduled 어노테이션과 Quartz Scheduler다.
@Scheduled
Spring Boot에서 흔히 쓰이는 Scheduled 어노테이션이다. Spring Boot에 내장되어 별도 의존성이 불필요하고, 간단한 설정으로 인해 스케줄링 시 가장 자주 쓰인다. 그러나 크론식 표현이나 fixedRate이라는 설정을 보면 동적으로 스케줄링이 불가하다는 점을 알 수 있다.
@Component
public class ScheduledTasks {
@Scheduled(fixedRate = 5000) // 5초마다
public void fixedRateTask() {}
@Scheduled(cron = "0 0 12 * * ?") // 매일 12시
public void cronTask() {}
@Scheduled(fixedDelay = 3000) // 이전 실행 완료 후 3초
public void fixedDelayTask() {}
}
Quartz
단순한 @Scheduled로는 해결할 수 없는 복잡한 스케줄링 요구사항이 있을 때 사용한다. 클러스터링을 지원해주고 (여러 서버에서 중복 실행 방지), 동적 스케줄 추가/수정/삭제 등이 가능하다. 클러스터 환경에서 안정적인 실행이 필요한 경우에 적합한 선택이다. 다만 설정이 복잡하고 리소스를 더 사용하므로, 프로젝트의 요구사항을 정확히 파악한 후 도입하는 것이 좋다.
@Configuration
public class QuartzConfig {
@Bean
public JobDetail jobDetail() {
return JobBuilder.newJob(MyJob.class)
.withIdentity("myJob")
.storeDurably()
.build();
}
}
@Scheduled vs Quartz - 무엇을 선택할까?
@Scheduled을 사용하는 경우
- 간단한 배치 작업이 필요할 때
- 스케줄이 고정적이고 변경할 일이 거의 없는 경우
- 단일 서버 환경
Quartz을 사용하는 경우
- 운영 환경에서 여러 서버가 동시에 실행되는 경우
- 스케줄을 동적으로 관리해야 하는 경우
- 작업 실행 이력과 모니터링이 중요한 경우
대부분의 프로젝트는 아마도 단순한 스케줄링 요구사항을 가지고 있어서 @Scheduled로 시작하는 것이 좋다. 하지만 서비스 규모가 커지고 운영 환경에서 안정성이 중요해진다면 Quartz로의 마이그레이션을 고려해볼 만하다.
CronExpression (Spring Framework 6.2.11 API)
Determine whether the given string represents a valid cron expression.
docs.spring.io
'TIL' 카테고리의 다른 글
| [TIL] jakarta vs springframework Transactional (0) | 2025.10.02 |
|---|---|
| [TIL] Layered Architecture (0) | 2025.10.01 |
| [TIL] Java에서의 병렬 처리 (1) | 2025.09.26 |
| [TIL] ResponseEntity (0) | 2025.09.22 |
| [TIL] Spring MVC - DispatcherServlet (0) | 2025.09.17 |