Spring Scheduler 사용법

김현찬·2025년 7월 10일

Spring Scheduler

  • Spring Framework에서 제공하는 기능으로, 정해진 시간에 작업을 자동으로 실행할 수 있게 도와주는 기능입니다.

Scheduler 사용법

@EnableScheduling

어플리케이션 클래스에 @EnableScheduling을 사용합니다.

@EnableScheduling   //클래스 단위 선언
public class BookifyApplication {

    public static void main(String[] args) {
        SpringApplication.run(BookifyApplication.class, args);
    }

}

@Scheduled

  • Spring Bean으로 등록된 클래스의 메서드 단위에서 선언하여 사용합니다.
@Service 	// @Service 어노테이션으로인해 컴포넌트 스캔되어 스프링 빈으로 자동 등록
public class StatisticsService {

    @Scheduled 	// 메서드 단위에서 사용
    public void bookRatingStatistics(){
    }
}

@Scheduled 규칙

메서드 타입은 반드시 void입니다.

  • @Scheduled 어노테이션은 특정 주기에 따라 메서드를 실행하도록 예약하는 데 사용됩니다. 이 어노테이션이 붙은 메서드는 스케줄러에 의해 주기적으로 호출되는데, 이때 반환 값은 무시됩니다. 따라서 굳이 반환 값을 사용할 필요가 없으므로, void로 설정합니다.

매개변수를 받을 수 없습니다.

  • @Scheduled어노테이션이 void타입이므로, 매개변수를 가질 수 없습니다.

@Scheduled 속성

@Scheduled의 속성은 해당 어노테션 내부를 살펴보면 확인할 수 있습니다.

각 속성의 적용 및 사용 방법을 알아보겠습니다.

cron (크론표현식 : 실행 주기 설정)

크론 표현식에서 각 자리는 초, 분, 시, 일, 월, 요일을 나타냅니다.

    @Scheduled(cron = "* * * * * *") // "*초 *분 *시 *일 *월 *요일" 즉 매 초마다 실행
    public void bookRatingStatistics() {
    }
}
    @Scheduled(cron = "30 * * * * *") // "*초 *분 *시 *일 *월 *요일" 매분30초마다
    public void bookRatingStatistics() {
    }
}
    @Scheduled(cron = "30 5 * * * *") // "*초 *분 *시 *일 *월 *요일" 매시간5분30초마다
    public void bookRatingStatistics() {
    }
}
    @Scheduled(cron = "30 5 15 * * *") // "*초 *분 *시 *일 *월 *요일" 매일15시5분30초마다
    public void bookRatingStatistics() {
    }
}
    @Scheduled(cron = "30 5 15 5 * *") // "*초 *분 *시 *일 *월 *요일" 매월5일15시5분30초마다
    public void bookRatingStatistics() {
    }
}

요일은 0=일, 1=월, 2=화, 3=수, 4=목, 5=금, 6=토 입니다.

표현식은 다음과 같습니다.

  1. * (모든 값)
@Scheduled(cron = "0 * * * * *") // 매 분 0초
  1. ? (충돌 회피)
@Scheduled(cron = "0 0 12 ? * WED") // 매주 수요일 12시에 실행
  1. - (범위)
@Scheduled(cron = "0 0 9-17 * * *") // 매일 9시~17시 매시 정각
  1. , (다중 값)
@Scheduled(cron = "0 0 9,15 * * *") // 매일 9시, 15시 정각에 실행
  1. / (증분)
@Scheduled(cron = "0 */10 * * * *") // 매 10분마다 실행 (0분부터 시작)
  1. L (마지막)
@Scheduled(cron = "0 0 0 L * *") // 매월 마지막 날 자정에 실행
  1. W (가장 가까운 평일)
@Scheduled(cron = "0 0 9 10W * *") // 매월 10일 기준 가장 가까운 평일 9시에 실행
  1. # (N번째 요일)
@Scheduled(cron = "0 0 9 ? * 4#2") // 매월 둘째 주 목요일 오전 9시에 실행

zone (cron 표현식 타임존 설정)

크론 표현식을 사용할 때의 타임존을 설정합니다.

    @Scheduled(cron = "* * * * * *", zone = "Asia/Seoul")
    public void bookRatingStatistics() {
    }
}

위와 같이 설정할 경우 아시아/서울 기준의 타임존이 적용됩니다.

fixedRate (작업 시작 시점부터 정의된 시간이 지나면 다음 작업 실행)

    @Scheduled(fixedRate = 2000)
    public void bookRatingStatistics() {
    }

milliseconds 단위입니다.

이전 작업 시작 시점으로부터 2초가 지날 경우 다음 작업을 실행합니다.

fixedRateString (fixedRate와 동일하나 문자열로 표기)

    @Scheduled(fixedRate = "2000")
    public void bookRatingStatistics() {
    }

fixedRate와 마찬가지로 이전 작업 시작 시점으로부터 2초 후에 다음 작업을 실행합니다.

fixedDelay (이전 작업 종료 시점부터 정의된 시간이 지나면 다음 작업 실행)

    @Scheduled(fixedDelay = 2000)
    public void bookRatingStatistics() {
    }

milliseconds 단위입니다.

이전 작업 종료 시점으로부터 2초가 지날 경우 다음 작업을 실행합니다.

fixedDelayString (fixedDelay와 동일하나 문자열로 표기)

    @Scheduled(fixedDelay = "2000")
    public void bookRatingStatistics() {
    }

fixedDelay와 마찬가지로 이전 작업 종료 시점으로부터 2초가 지날 경우 다음 작업을 실행합니다.

initialDelay (초기 지연 시간 설정)

    @Scheduled(fixedRate = 2000, initialDelay = 10000)
    public void bookRatingStatistics() {
    }

milliseconds 단위입니다.

initialDelay설정 시 10초의 대기시간이 지난 후 작업 종료 2초마다 다음 작업을 실행합니다.

initialDelayString (initialDelay와 동일하나 문자열로 표기)

    @Scheduled(fixedRate = 2000, initialDelay = "10000")
    public void bookRatingStatistics() {
    }

initialDelay와 마찬가지로 10초의 대기시간이 지난 후 작업 종료 2초마다 다음 작업을 실행합니다.

5분 주기 로그 출력 테스트

    @Scheduled(fixedDelay = 300000)
    public void bookRatingStatistics() {
        log.info("테스트중입니다.");
    }

0개의 댓글