@Scheduled
- 일정 시간을 간격 또는 특정 시간마다 코드가 실행되도록 설정하는 어노테이션
사용법
- @Schelduled를 사용하기 위해서는 Application에게 Schedular를 사용하겠다는 것을 알리기 위해 @EnableScheduling을 선언
@EnableScheduling
@SpringBootApplication
public class SchedulerApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
스케쥴링을 작업할 클래스 생성
@Service
public class SchedulerService {
@Scheduled(fixedRate = 1000) // 1초마다 실행
public void run(){
System.out.println("Hello Scheduler");
}
}
주의할 점은 @Component(@Controller, @Service, @Repository)
즉, 스프링 빈에 등록된 클래스만 스케쥴을 사용할 수 있다는 점
@Scheduled 규칙
- 메서드의 반환 타입은 반드시 void
- 매개 변수 사용 불가
@Scheduled 속성 (milliseconds 단위)
- fixedDelay : 이전 Task(작업)의 종료 시점을 기준으로 정의된 시간만큼 지난 후 Task(작업)을 실행
@Scheduled(fixedDelay = 1000)
public void run(){
System.out.println("Hello Scheduler");
}
- fixedDelayString : fixedDelay와 동일하고, 문자열로 단위를 표기
@Scheduled(fixedDelayString = "1000")
public void run(){
System.out.println("Hello Scheduler");
}
- fixedRate : 이전 Task(작업)의 시작 시점을 기준으로 정의된 시간만큼 지난 후 Task(작업)을 실행
@Scheduled(fixedRate = 1000)
public void run(){
System.out.println("Hello Scheduler");
}
- fixedRateString : fixedRate와 동일하고, 문자열로 단위를 표기
@Scheduled(fixedRateString = "1000")
public void run(){
System.out.println("Hello Scheduler");
}
- cron : cron 표현식을 사용하여 작업을 예약
@Scheduled(cron = "* * * * * *")
public void run(){
System.out.println("Hello Scheduler");
}
첫 번째 별(*)부터 마지막 별(*)까지 의미
초(0-59) / 분(0-59) / 시(0-23) / 일(1-31) / 월(1-12) / 요일(0-6)
- 요일 → 0 : 일, 1 : 월, 2 : 화, ... , 6 : 토
Cron 표현식
- * : 모든 조건을 의미
- 매초, 매시, 매분, 매일, 매월 등
- ? : 설정값 없음
- 날짜와 요일에서만 사용 가능
- - : 범위를 지정할 때 사용
- , : 여러 값을 지정할 때 사용
- / : 증분값
→ 즉, 초기값과 증가치 설정에 사용 - L : 마지막
→ 지정할 수 있는 범위의 마지막 값 설정 시 사용- 날짜와 요일에서만 사용 가능
- W : 가장 가까운 평일을 설정할 때 사용
- Ex) 10W
- 10일이 평일일 경우 → 10일에 실행
- 10일이 토요일일 경우 → 가장 가까운 평일인 9일(금요일)에 실행
- 10일이 일요일일 경우 → 가장 가까운 평일인 11일(월요일)에 실행
- # : N번째 주 특정 요일을 설정할 때 사용
- 요일에서만 사용 가능
- Ex) 4#2 → 둘째주 목요일에 실행
- zone : cron 표현식을 사용할 때의 time zone으로 설정하지 않으면 기본적으로 Local의 Time zone
@Scheduled(cron = "* * * * * *", zone = "Asia/Seoul")
public void run(){
System.out.println("Hello Scheduler");
}
Cron 사용 예시
@Scheduled(cron = "0 0 18 * * *", zone = "Asia/Seoul")
public void execute1(){
System.out.println("Hello Scheduler");
}
// 매월 10일, 20일 14시에 실행
@Scheduled(cron = "0 0 14 10,20 * ?", zone = "Asia/Seoul")
public void execute2(){
System.out.println("Hello Scheduler");
}
// 매월 마지막날 22시에 실행
@Scheduled(cron = "0 0 22 L * ?", zone = "Asia/Seoul")
public void execute3(){
System.out.println("Hello Scheduler");
}
// 1시간 마다 실행
@Scheduled(cron = "0 0 0/1 * * *", zone = "Asia/Seoul")
public void execute4(){
System.out.println("Hello Scheduler");
}
// 매일 9:00 ~ 9:55, 18:00 ~ 18:55 사이에 5분 간격 실행
@Scheduled(cron = "0 0/5 9,18 * * *", zone = "Asia/Seoul")
public void execute5(){
System.out.println("Hello Scheduler");
}
// 매일 09:00 ~ 18:55 사이에 5붠 간격 실행
@Scheduled(cron = "0 0/5 9-18 * * *", zone = "Asia/Seoul")
public void execute6(){
System.out.println("Hello Scheduler");
}
// 매달 1일 10시 30분에 실행
@Scheduled(cron = "0 30 10 1 * *", zone = "Asia/Seoul")
public void execute7(){
System.out.println("Hello Scheduler");
}
// 매년 3월, 월~금 10시 30분에 실행
@Scheduled(cron = "0 30 10 ? 3 1-5", zone = "Asia/Seoul")
public void execute8(){
System.out.println("Hello Scheduler");
}
// 매월 마지막 토요일 10시 30분에 실행
@Scheduled(cron = "0 30 10 ? * 6L", zone = "Asia/Seoul")
public void execute9(){
System.out.println("Hello Scheduler");
}
'Language > Spring' 카테고리의 다른 글
[Authentication] Cookie, Session, JWT Token (0) | 2024.08.26 |
---|---|
[Spring Boot] 일정 주기마다 업데이트 프로젝트 적용해보기 (0) | 2024.08.19 |
[Spring Boot] Redis를 이용한 이메일 인증 리팩토링 (0) | 2024.08.13 |
레디스(Redis) 개념 및 설치 (0) | 2024.08.13 |
[Spring Boot] 이메일 인증 코드를 이용한 회원 가입 (0) | 2024.08.13 |