간단한 설명
스프링 프레임워크에서 제공하는 작업 스케줄링 기능으로 특정 작업을 일정 주기마다 자동으로 실행하도록 설정할 수 있습니다.
주로 배치 작업, 알림, 정기적인 데이터 처리 등에 사용됩니다.
저는 지금 캡스톤 프로젝트에서 계정 삭제일로부터 1달이 지난 계정을 삭제할 로직, 통계 데이터, 유저 예약 알림 등을 사용하기 위해 정리했습니다.
주요 어노테이션
@EnableScheduling
스케줄링 기능을 활성화 할 때 사용됩니다(주로 설정 클래스에서 사용)
@Scheduled
메서드에 적용하며 스케줄을 설정합니다.
사용 예제
스케줄러 설정하기
@Configuration
@EnableScheduling
public class SchedulerConfig {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(5); // 동시 실행할 스레드 수
scheduler.setThreadNamePrefix("my-scheduler-");
scheduler.setAwaitTerminationSeconds(30); // 종료 시 대기 시간
scheduler.setWaitForTasksToCompleteOnShutdown(true); // 작업 완료 대기
scheduler.setErrorHandler(t -> System.err.println("스케줄러 예외 발생: " + t));
return scheduler;
}
}
아무것도 안적고 SchedulerConfig를 생성하여 어노테이션만 붙이셔도 됩니다만 위 예제처럼 세부적인 설정을 할 수 있습니다.
스케줄러 사용하기
@Component
public class MyScheduler {
// 10초마다 실행
@Scheduled(fixedRate = 10000)
public void runEveryTenSeconds() {
System.out.println("10초마다 실행: " + LocalDateTime.now());
}
// 매일 오전 2시에 실행
@Scheduled(cron = "0 0 2 * * *")
public void runAtTwoAM() {
System.out.println("매일 2시에 실행됨");
}
}
스케줄 방식
fixedRate : 메서드 시작 시간 기준으로 주기적으로 실행(단위:ms)
fixedDelay : 메서드 종료 후 일정 시간 뒤에 실행
cron : 크론 표현식을 사용한 정교한 스케줄리
cron 표현식
6~7자리로 구성되어 있으며, 각 자리의 의미는 다음과 같습니다.
초 (0-59)
분 (0-59)
시 (0-23)
일 (1-31)
월 (1-12)
요일 (0-7) → 0 또는 7 = 일요일
[연도 (선택, 보통 생략)]
주요 특수 문자
문자 | 의미 |
* | 매번 (every) |
, | 여러 값 (OR) |
- | 범위 |
/ | 주기 (ex: */5 → 5마다) |
? | 아무 값 아님 (일/요일 중 하나만 지정할 때 사용) |
L | 마지막 (ex: L은 마지막 날, 6L은 마지막 금요일 등) |
# | 특정 요일의 n번째 (예: 2#1 = 매월 첫 번째 월요일) |
실용 예시 모음
표현식 | 설명 |
0 * * * * * | 매 분 0초에 실행 |
0 0 9 * * * | 매일 오전 9시에 실행 |
0 0/5 * * * * | 5분마다 실행 |
0 0 2 * * * | 매일 새벽 2시에 실행 |
0 0 0 1 * * | 매월 1일 자정에 실행 |
0 0 0 * * MON | 매주 월요일 자정에 실행 |
0 0 12 ? * WED | 매주 수요일 12시에 실행 |
0 0 8-10 * * * | 매일 8시~10시 사이 매 정시에 실행 |
0 15 10 ? * 6L | 매월 마지막 금요일 10:15에 실행 |
0 0 9 ? * 2#1 | 매월 첫 번째 월요일 9시에 실행 |
주의사항
- @Scheduled 메서드는 파라미터 없이 void 리턴이어야 합니다
- 크론 표현식은 시스템 시간대에 따라 달라질 수 있습니다 (TimeZone 설정 가능)
- 예외 발생 시 다음 실행이 중단될 수 있으므로 예외 처리가 중요합니다
'Spring Boot' 카테고리의 다른 글
[Spring Boot] 영속성 컨텍스트(Persistence Context) (0) | 2025.06.12 |
---|---|
[Spring Boot] QR Code 발급하기 (0) | 2025.05.17 |
[Spring Boot] 파일 저장 시스템 (1) | 2025.04.26 |
[Spring Boot] Optional (0) | 2025.04.16 |
[Spring boot] 프록시 객체(Proxy Object) (1) | 2025.03.29 |