[Spring Boot] @Scheduled을 이용해 일정 시간 마다 코드 실행하기
by coco3o@Scheduled
Spring Boot에서 @Scheduled 어노테이션을 사용하면 일정한 시간 간격으로, 혹은 특정 시간에 코드가 실행되도록 설정할 수 있다.
주기적으로 실행해야 하는 작업이 있을 때 적용해 쉽게 사용하자.
@Scheduled 사용법
@Scheduled 어노테이션을 사용하기 위해 다음과 같이 Application Class에 @EnableScheduling을 추가한다.
@EnableScheduling
@SpringBootApplication
public class SchedulerApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
그리고 실제 스케줄링 작업할 클래스를 만든다.
@Service
public class SchedulerService {
@Scheduled(fixedDelay = 1000) // 1초마다 실행
public void run() {
System.out.println("Hello CoCo World!);
}
}
여기서 중요한건 @Component(@Service 등) 즉, 스프링 빈에 등록된 클래스여야 한다.
이렇게 두 개의 어노테이션을 적기만 하면 설정은 끝이고 다음 규칙을 지키며 스케줄러 메소드를 만들자.
- @Scheduled 규칙
- Method는 void 타입으로
- Method는 매개변수 사용 불가
@Scheduled 속성
fixedDelay : milliseconds 단위로, 이전 Task의 종료 시점으로부터 정의된 시간만큼 지난 후 Task를 실행한다.
@Scheduled(fixedDelay = 1000)
public void run() {
System.out.println("Hello CoCo World!");
}
fixedDelayString : fixedDelay와 같은데 문자열로 값을 표현하겠다는 의미이다.
@Scheduled(fixedDelay = "1000")
public void run() {
System.out.println("Hello CoCo World!");
}
fixedRate : milliseconds 단위로, 이전 Task의 시작 시점으로부터 정의된 시간만큼 지난 후 Task를 실행한다.
@Scheduled(fixedRate = 1000)
public void run() {
System.out.println("Hello CoCo World!");
}
fixedRateString : fixedRate와 같은데 문자열로 값을 표현하겠다는 의미이다.
@Scheduled(fixedRateString = "1000")
public void run() {
System.out.println("Hello CoCo World!");
}
※ fixedDelay vs fixedRate
fixedRate는 작업 수행시간과 상관없이 일정 주기마다 메소드를 호출하는 것이고,
fixedDelay는 (작업 수행 시간을 포함하여) 작업을 마친 후부터 주기 타이머가 돌아 메소드를 호출하는 것이다.
initialDelay : 스케줄러에서 메소드가 등록되자마자 수행하는 것이 아닌 초기 지연시간을 설정하는 것이다.
@Scheduled(fixedRate = 5000, initialDelay = 3000)
public void run() {
System.out.println("Hello CoCo World!");
}
위와 같이 사용하면 3초의 대기시간(initialDelay) 후에 5초(fixedRate)마다 "Hello CoCo World!"를 출력하는 작업을 스케줄러가 수행해준다.
initialDelayString : 위와 마찬가지로 문자열로 값을 표현하겠다는 의미이다.
@Scheduled(fixedRate = 5000, initialDelayString = "3000")
public void run() {
System.out.println("Hello CoCo World!");
}
cron : Cron 표현식을 사용하여 작업을 예약할 수 있다.
@Scheduled(cron = "* * * * * *")
public void run() {
System.out.println("Hello CoCo World!");
}
첫 번째 * 부터
초(0-59)
분(0-59)
시간(0-23)
일(1-31)
월(1-12)
요일(0-6) (0: 일, 1: 월, 2:화, 3:수, 4:목, 5:금, 6:토)
Spring @Scheduled cron은 6자리 설정만 허용하며 연도 설정을 할 수 없다.
Cron 표현식 :
* : 모든 조건(매시, 매일, 매주처럼 사용)을 의미
? : 설정 값 없음 (날짜와 요일에서만 사용 가능)
- : 범위를 지정할 때
, : 여러 값을 지정할 때
/ : 증분값, 즉 초기값과 증가치 설정에 사용
L : 마지막 - 지정할 수 있는 범위의 마지막 값 설정 시 사용 (날짜와 요일에서만 사용 가능)
W : 가장 가까운 평일(weekday)을 설정할 때
예) 10W
- 10일이 평일 일 때 : 10일에 실행
- 10일이 토요일 일 때 : 가장 가까운 평일인 금요일(9일)에 실행
- 10일이 일요일 일 때 : 가장 가까운 평일인 월요일(11일)에 실행
# : N번째 주 특정 요일을 설정할 때 (-요일에서만 사용 가능)
예) 4#2
- 목요일#2째주에 실행
zone : cron 표현식을 사용했을 때 사용할 time zone으로 따로 설정하지 않으면 기본적으로 Local의 time zone이다.
@Scheduled(cron = "* * * * * *", zone = "Asia/Seoul")
public void run() {
System.out.println("Hello CoCo World!");
}
cron 사용 예시
// 매일 오후 18시에 실행
@Scheduled(cron = "0 0 18 * * *")
public void run() {
System.out.println("Hello CoCo World!");
}
// 매달 10일,20일 14시에 실행
@Scheduled(cron = "0 0 14 10,20 * ?")
public void run() {
System.out.println("Hello CoCo World!");
}
// 매달 마지막날 22시에 실행
@Scheduled(cron = "0 0 22 L * ?")
public void run() {
System.out.println("Hello CoCo World!");
}
// 1시간 마다 실행 ex) 01:00, 02:00, 03:00 ...
@Scheduled(cron = "0 0 0/1 * * *")
public void run() {
System.out.println("Hello CoCo World!");
}
// 매일 9시00분-9시55분, 18시00분-18시55분 사이에 5분 간격으로 실행
@Scheduled(cron = "0 0/5 9,18 * * *")
public void run() {
System.out.println("Hello CoCo World!");
}
// 매일 9시00분-18시55분 사이에 5분 간격으로 실행
@Scheduled(cron = "0 0/5 9-18 * * *")
public void run() {
System.out.println("Hello CoCo World!");
}
// 매달 1일 10시30분에 실행
@Scheduled(cron = "0 30 10 1 * *")
public void run() {
System.out.println("Hello CoCo World!");
}
// 매년 3월내 월-금 10시30분에 실행
@Scheduled(cron = "0 30 10 ? 3 1-5")
public void run() {
System.out.println("Hello CoCo World!");
}
// 매달 마지막 토요일 10시30분에 실행
@Scheduled(cron = "0 30 10 ? * 6L")
public void run() {
System.out.println("Hello CoCo World!");
}
'🌈Programming > Spring Boot' 카테고리의 다른 글
[Spring Boot] Validation 적용, @Valid로 유효성 검사하기 (1) | 2021.12.17 |
---|---|
[Spring Boot] MySQL & JPA 연동 및 테스트 (Gradle 프로젝트) (7) | 2021.07.23 |
[Spring Boot] Gradle jar 빌드 및 배포하기 (2) | 2021.06.28 |
[Spring Boot] 프로젝트 구조 살펴보기 (0) | 2021.06.28 |
[Spring Boot] intelliJ로 Spring Boot 프로젝트 생성 및 실행하기 (0) | 2021.06.28 |
블로그의 정보
슬기로운 개발생활
coco3o