Spring Scheduler
스케줄러는 스프링 프레임워크에 포함된 기능입니다. 특정 시간이나 정해진 주기에 따라 작업을 수행하는데 사용하는데 오늘은 이 기능에 대해서 알아봅시다.
사용방법
설정
Spring Scheduler를 사용하기 위해서는 @EnableScheduling 어노테이션을 선언해주어야 합니다.
@EnableScheduling
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
구현
다음은 스케줄을 구현하면되는데 스프링 빈으로 등록되어야지 동작합니다.
@Component
public class TestSchedule {
@Scheduled(fixedRate = 1000)
public void test() {
System.out.println("TestSchedule");
}
}
실행해보면 1초간격으로 동작하는것을 확인할 수 있습니다.
@Scheduled 사용법
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
@Reflective
public @interface Scheduled {
String CRON_DISABLED = "-";
String cron() default "";
String zone() default "";
long fixedDelay() default -1L;
String fixedDelayString() default "";
long fixedRate() default -1L;
String fixedRateString() default "";
long initialDelay() default -1L;
String initialDelayString() default "";
TimeUnit timeUnit() default TimeUnit.MILLISECONDS;
String scheduler() default "";
}
- cron
- 표현식을 이용해 스케줄을 지정할 수 있습니다.
- "초 분 시 일 월 요일" 형식으로 작성합니다.
- 자세한 설명을 글 하단에서 하겠습니다.
- zone
- cron 표현식에서 사용할 시간대를 지정합니다.
- default 는 서버의 로컬 시간대입니다.
- "Asia/Seoul", "UTC" 등
- fixedDelay, fixedDelayString
- 이전 작업의 종료시점부터 다음 작업의 시작까지의 지연시간입니다.
- default fixedDelay = 1000 : 1초 (이전 작업 완료 후 1초 뒤 실행)
- 단위는 timeUnit에 따라 변경될 수 있습니다.
- fixedRate, fixedRateString
- 이전 작업의 시작지점부터 다음 작업의 시작까지의 시간간격입니다.
- default fixedRate = 1000 : 1초 (이전 작업 시작으로부터 1초 마다 실행)
- 단위는 timeUnit에 따라 변경될 수 있습니다.
- initialDelay, initalDelayString
- 애플리케이션 시작 후 첫 작업이 실행되기까지의 지연시간을 지정할 수 있습니다.
- default는 위와 같습니다.
- 단위는 timeUnit에 따라 변경될 수 있습니다.
- timeUnit
- fixedDelay, fixedRate, initialDelay의 시간단위를 지정합니다.
- default TimeUnit.MILLISECONDS
- scheduler
- 스케줄러의 이름을 지정할 수 있습니다.
@Scheduled(cron = "0 0 12 * * ?") // 매일 12시에 실행
public void test1() {
// 작업 내용
}
@Scheduled(fixedRate = 5000) // 5초마다 실행
public void test2() {
// 작업 내용
}
@Scheduled(fixedDelay = 1000, initialDelay = 5000) // 시작 5초 후 첫 실행, 이후 1초 간격으로 실행
public void test3() {
// 작업 내용
}
cron
cron은 "초 분 시 일 월 요일" 형식으로 된 String 문자열입니다.
필드 | 허용값 |
초 | 0 - 59 |
분 | 0 - 59 |
시 | 0 - 23 |
일 | 1 - 31 |
월 | 1- 12 | JAN-DEC |
요일 | 0 - 6 | SUN - SAT |
cron 특수문자
특수문자 | 설명 | 예제 |
* | 모든 값 | |
? | 특정한 값이 없음 | 일, 요일에서만 사용가능 |
- | 범위를 나타냄 | 1-3 : 1월 ~ 3월 |
, | 값을 여러개 나열 | MON,SAT,SUN : 월,토,일 |
/ | 시작시간과 단위 | 분에서 1/5 : 1분부터 5분단위로 |
L | 마지막 값 | 일, 요일에서만 사용가능 일에서 사용하면 마지막 일, 요일에서 사용하면 마지막 요일(6) |
W | 가장 가까운 평일 | 일 에서만 사용가능 1W : 1일에서 가장 가까운 평일 |
# | 몇째주의 무슨요일 | 0#3 : 3번째 주 일요일 |
cron 예제
// 매일 자정에 실행
@Scheduled(cron = "0 0 0 * * ?")
// 평일 오전 9시에 실행
@Scheduled(cron = "0 0 9 * * MON-FRI")
// 매월 1일 오전 3시에 실행
@Scheduled(cron = "0 0 3 1 * ?")
// 매주 일요일 자정에 실행
@Scheduled(cron = "0 0 0 ? * SUN")
// 매월 마지막 날 오후 11시 45분에 실행
@Scheduled(cron = "0 45 23 L * ?")
// 매월 마지막 토요일 오후 10시에 실행
@Scheduled(cron = "0 0 22 ? * 6L")
// 매월 첫번째 화요일 오전 9시에 실행
@Scheduled(cron = "0 0 9 ? * 2#1")
// 매일 오전 9시부터 오후 5시까지 30분마다 실행
@Scheduled(cron = "0 0/30 9-17 * * ?")
// 매일 10시 15분에 실행
@Scheduled(cron = "0 15 10 * * ?")
// 매주 월요일 10시에 실행
@Scheduled(cron = "0 0 10 ? * MON")
// 매주 월,수,금 10시에 실행
@Scheduled(cron = "0 0 10 ? * MON,WED,FRI")
// 15분마다 실행
@Scheduled(cron = "0 0/15 * * * ?")
// 평일 9시-18시 정각마다 실행
@Scheduled(cron = "0 0 9-18 * * MON-FRI")
// 매월 마지막날 12시에 실행
@Scheduled(cron = "0 0 12 L * ?")
// 매월 마지막 평일 12시에 실행
@Scheduled(cron = "0 0 12 LW * ?")
설정분리
schedule.cron=3 * * * * ?
schedule.enabled=true
application.properties에 설정값을 분리하고
@Component
public class TestSchedule {
@Value("${schedule.enabled}")
private boolean enabled;
@Scheduled(cron = "${schedule.cron}")
public void test() {
if (enabled) {
System.out.println("TestSchedule");
}
}
}
이렇게 작성하면 설정부분과 실행부분을 나눌 수 있어서 좋은것 같습니다.
'FrameWork > Spring' 카테고리의 다른 글
[Spring Security] 스프링 시큐리티 Anonymous과 ExceptionHandling (4) (0) | 2024.12.15 |
---|---|
[Spring Security] 스프링 시큐리티 RememberMe (3) (0) | 2024.12.13 |
[Spring Security] 스프링 시큐리티 시작하기 (로그인, 로그아웃과 권한) (2) (0) | 2024.12.12 |
[Spring Security] 스프링 시큐리티 이해하기 (1) (0) | 2024.12.10 |
[Spring] JAVA로 금지어 검사기를 만들어보자 (0) | 2024.09.16 |