@Scheduled 어노테이션
소개
서버가 실행되고있을때 원하는 주기마다 코드를 실행할 수 있도록 해주는 어노테이션이다.
매월이나 매주 혹은 매일마다 실행되게할 수 있어서 유용하다.
쓰레드, 비동기 등 .. 더 자세한 내용은 이번 포스팅에서 다루지않았지만, 다음에 필요시 다룰 예정이다.
필요 디펜던시
별도 설치가 필요없다.
왜냐면, 스프링 부트에서 기본 제공하는 spring-boot-starter-web 디펜던시를 사용하기때문이다.
세팅 방법
MainApplication 클래스 파일에서 @EnableScheduling 어노테이션만 추가해주면 끝.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
🔍 사용 예시
매일마다 실행
@Component
public class SchedulerServiceImpl {
/* 서버 실행시 최초 실행되고 */
@PostConstruct
public void init() {
executeTask();
}
/* 그리고, 매일 자정마다 실행 */
@Scheduled(cron = "0 0 0 * * *")
public void executeDailyTask() {
executeTask();
}
/* 실행될 내용 */
private void executeTask() {
// ...
}
}
Scheduled 속성
기본
@Component
public class 클래스명 {
@Scheduled(속성 = 속성값)
private void 메소드명() {
/* ... 실행될 내용 ... */
}
}
fixedDelay, fixedDelayString
기존 스케줄 작업이 완전히 종료될 때까지 기다리고, 설정된 N초후 다시 반복된다.
@Component
public class 클래스명 {
@Scheduled(fixedDelay = 1_000) // 1,000밀리초 -> 1초 단위로 동작
private void 메소드명() {
/* ... 실행될 내용 ... */
}
/*
만약, 숫자 대신 문자열을 입력하고싶다면
fixedDelay 대신 fixedDelayString 속성을 이용할 수 있다.
예시)
@Scheduled(fixedDelayString = "1000") // 1,000밀리초 -> 1초 단위로 동작
private void 메소드명() {
// ... 실행될 내용 ...
}
*/
}
fixedRate, fixedRateString
기존 스케줄 작업이 완전히 종료될 때까지 기다리지않고, 무조건 N초 단위로 반복된다.
스케줄러의 간격보다, 스케줄 내용이 완료되는 시간이 더 소요될경우 안전성을 보장할 수 없다는 단점이 있다.
ex 1) 스케줄러 간격이 1초인데, 그때마다 실행될 내용이 1초 이상으로 소요될경우
ex 2) 스케줄러 간격 1초, 그때마다 동작될 메소드의 실행 완료까지 소요시간 3초
참고 문서) https://seriouskang.tistory.com/2 게시글의 " 3. fixedRate vs fixedDelay " 내용
@Component
public class 클래스명 {
@Scheduled(fixedDelay = 1_000) // 1,000밀리초 -> 1초 단위로 동작
private void 메소드명() {
/* ... 실행될 내용 ... */
}
/*
만약, 숫자 대신 문자열을 입력하고싶다면
fixedDelay 대신 fixedDelayString 속성을 이용할 수 있다.
예시)
@Scheduled(fixedDelayString = "1000") // 1,000밀리초 -> 1초 단위로 동작
private void 메소드명() {
// ... 실행될 내용 ...
}
*/
}
initialDelay
서버가 실행된 그 즉시가 아니라, 원하는 시간만큼 지난 이후부터 스케줄러가 작동되게할 수 있다.
그래서 해당 속성은 위의 fixedRate 혹은 fixedDelay 속성을 함께 이용할 수 있다.
@Component
public class 클래스명 {
@Scheduled(fixedRate = 3_000, initialDelay = 5_000) // 서버 실행되고 5초 이후부터, 매 3초 단위로 실행
private void 메소드명() {
/* ... 실행될 내용 ... */
}
// 참고) fixedRate 대신 fixedDelay를 사용할 수 있다.
}
cron
얼핏보면, 리눅스의 crontab과 비슷하지만 조금 다르다.
요일의 0, 7은 각각 일요일을 뜻하며, 1 월요일부터 ~ 6 토요일로 구성되어있다.
@Component
public class 클래스명 {
@Scheduled(cron = "[초: 0-59] [분: 0-59] [시: 0-23] [일: 1-31] [월: 1-12] [요일: 0-7]")
private void 메소드명() {
/* ... 실행될 내용 ... */
}
}
cron 필드에서 사용가능한 메타 문자
필드명 | 범위 | 사용 가능한 메타 문자 |
초 | 0-59 | , - * / |
분 | 0-59 | |
시 | 0-23 | |
일 | 1-31 | , - * / L W |
월 | 1-12 | , - * / |
요일 | 0-7 | , - * ? / L # |
cron 필드에서 사용되는 메타 문자 설명
메타 문자 | 설명 | 예시 |
* | 모든 값 | |
? | 특정 한 값이 없음 | |
- | 언제부터 언제까지를 표현할때 사용 | 월요일부터 수요일까지 표현 -> MON-WED |
, | 다중 조건을 표현할때 사용 | 월 수 금 표현 -> MON,WED,FRI |
/ | 시작 단위 / 그 이후 | 오후6시부터 1시간마다 -> 18/1 |
L | 해당 단위의 가장 마지막 (일, 월) | |
W | 가장 가까운 평일 | 15일에서 가장 가까운 평일 -> 15W |
# | 몇째 주의 무슨 요일을 표현 | 2번째주 수요일(3) -> 3#2 |
참고 문서
[Spring] 주기적인 작업 구현하기(feat. Scheduling Tasks)
최근에 어플리케이션이 기동되는 동안 주기적으로 특정 작업이 수행되어야 한다는 요구사항이 있었다. 구체적으로는 MQ에서 메세지를 주기적으로 가져와야 하는 상황이었는데, 내부에서 사용
seriouskang.tistory.com
스프링 부트에서 Schedule 사용하기
시작하며 특정 시간에 주기적으로 해야 하는 일이 있습니다. 뉴스레터와 같은 이메일 발송, 주기적으로 데이터베이스 동기화, 이용시간이 적은 시간에 대량 로그 전송 등등의 일이 그 예시가 될
covenant.tistory.com
[Spring Boot] @Scheduled를 이용한 스케쥴러 구현하기
Spring Boot`에서 @Scheduled 어노테이션을 이용하여 스케쥴러를 구현하는 방법에 대해 작성하였습니다
velog.io
스프링부트 스케줄 설정 법 & Cron 주기설정
스프링 스케줄 설정 법 @SpringBootApplication @EnableScheduling public class Scheduler { @Scheduled(cron = "10 * * * * *") public void run() { // TODO System.out.println("현재 시간은 " + new Date()); } } Colored by Color Scripter cs 클래스
itworldyo.tistory.com
'💻 FullStack > SpringBoot' 카테고리의 다른 글
JPA Auditing 등록 및 수정 일시, 그리고 사용자 명 자동화 (0) | 2024.03.10 |
---|---|
DBMS별 application 파일 설정 방법 (0) | 2024.03.09 |
Spring Data JPA 네이티브 쿼리 (0) | 2023.08.19 |
Spring Data JPA 쿼리 메소드 (0) | 2023.08.15 |
Spring Data JPA 로그 설정들 (0) | 2023.08.13 |