@Scheduled
해당 어노테이션을 활용하면 일정 시간 간격 혹은 특정 시간에 원하는 메소드를 실행하도록 해주는 어노테이션이다.
사용법
나같은 경우에는 실제로 원하는 디렉토리의 파일들을 최종 수정시간과 현재 시간을 비교하여 특정 시간만큼 차이가 나면 삭제시키도록 하는 기능을 만들어야 했다.
우선 @Scheduled를 사용하기 위해서는 Application 파일에 @EnableScheduling 를 추가해줘야 한다.(나 Scheduled 쓴다~ 하고 선언하는 것)
그리고는 @Scheduled를 적용할 클래스를 만드는데
@Component
public class FileClean {
@Scheduled(fixedRate = 60 * 60 * 1000) // 1시간마다 실행
public void run() {
System.out.println("Scheduled TEST");
}
}
주의할 점은 @Component 혹은 @Service와 같이 빈에 등록된 클래스여야만 한다.
이렇게만 해주면 설정은 끝이고 조금의 규칙이 있다.
1. 메소드 리턴 타입은 void여야 함
2. 메소드에 파라미터 사용 불가능
또한, Scheduled의 속성으로는
@Scheduled(fixedDelay = 1000) //milliseconds 단위로, 이전 Task의 종료 시점으로부터 정의된 시간만큼 지난 후 Task를 실행
@Scheduled(fixedDelay = "1000") //fixedDelay와 같은데 문자열로 값을 표현하겠다는 의미
@Scheduled(fixedRate = 1000) //milliseconds 단위로, 이전 Task의 시작 시점으로부터 정의된 시간만큼 지난 후 Task를 실행
@Scheduled(fixedRateString = "1000") //fixedRate와 같은데 문자열로 값을 표현하겠다는 의미
fixedRate는 작업의 수행시간과 상관 없이 일정 주기마다 메소드를 호출하는 것.
fixedDelay는 작업을 마친 후부터 타이머가 돌아 메소드를 호출하는 것.
그리고 cron 표현식을 사용하여 작업을 예약할 수도 있다.
@Scheduled(cron = "* * * * * *")
이는 첫 번째 "*"부터
초(0-59)
분(0-59)
시간(0-23)
일(1-31)
월(1-12)
요일(0-6) (0: 일, 1: 월, 2:화, 3:수, 4:목, 5:금, 6:토)
* : 모든 조건(매시, 매일, 매주처럼 사용)을 의미
? : 설정 값 없음 (날짜와 요일에서만 사용 가능)
- : 범위를 지정할 때
, : 여러 값을 지정할 때
/ : 증분값, 즉 초기값과 증가치 설정에 사용
L : 마지막 - 지정할 수 있는 범위의 마지막 값 설정 시 사용 (날짜와 요일에서만 사용 가능)
W : 가장 가까운 평일(weekday)을 설정할 때
를 의미한다.
cron 사용 예시
// 매일 오전 10시에 실행 (요일은 신경 쓰지 않음)
@Scheduled(cron = "0 0 10 * * ?")
public void everyDayAtTenAM() {
System.out.println("매일 오전 10시에 실행");
}
// 매일 오전 9시부터 11시까지 매시간 0분에 실행
@Scheduled(cron = "0 0 9-11 * * ?")
public void everyHourFromNineToEleven() {
System.out.println("9시에서 11시 사이 매 정각마다 실행");
}
// 월, 수, 금 오전 10시에 실행
@Scheduled(cron = "0 0 10 * * MON,WED,FRI")
public void specificDaysOfWeek() {
System.out.println("월, 수, 금 오전 10시에 실행");
}
// 매 15분마다 실행 (0분, 15분, 30분, 45분)
@Scheduled(cron = "0 */15 * * * *")
public void everyFifteenMinutes() {
System.out.println("매 15분마다 실행");
}
// 매월 마지막 날 자정에 실행
@Scheduled(cron = "0 0 0 L * ?")
public void lastDayOfMonth() {
System.out.println("매월 마지막 날 자정에 실행");
}
// 매주 토요일에 실행 (주간의 마지막 날)
@Scheduled(cron = "0 0 0 ? * 7L")
public void everyLastSaturday() {
System.out.println("매월 마지막 토요일 자정에 실행");
}
// 매월 1일에 가장 가까운 평일에 오전 9시 실행
@Scheduled(cron = "0 0 9 1W * ?")
public void nearestWeekdayToFirst() {
System.out.println("매월 1일에 가장 가까운 평일 오전 9시에 실행");
}
'Spring' 카테고리의 다른 글
[Spring] AES 암호화 알고리즘 (0) | 2024.10.28 |
---|---|
[Spring] WAR과 JAR (2) | 2024.10.25 |
[Spring] Spring에서 redis 서버 사용 (3) | 2024.09.30 |
[Spring Boot] 외장 톰캣 웹 배포하기(apache-tomcat) (0) | 2024.09.25 |
[Spring] web.xml 한글 필터 (0) | 2024.05.20 |