본문 바로가기

Spring Boot

[Spring Boot] Scheduler

간단한 설명

스프링 프레임워크에서 제공하는 작업 스케줄링 기능으로 특정 작업을 일정 주기마다 자동으로 실행하도록 설정할 수 있습니다.

주로 배치 작업, 알림, 정기적인 데이터 처리 등에 사용됩니다.

저는 지금 캡스톤 프로젝트에서 계정 삭제일로부터 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 설정 가능)
  • 예외 발생 시 다음 실행이 중단될 수 있으므로 예외 처리가 중요합니다