스프링 부트에서 스케줄러를 돌려서 일정 시간마다 혹은 일정 시간에 로직을 수행하는 방법을 알아볼게요.
설정 파일
스프링 부트에서 스케줄러 기능을 사용하기 위해 @EnableScheduling 설정을 해줄게요.
@Configuration
@EnableScheduling
public class ScheduledConfig {
@Bean
public TaskScheduler scheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(4);
return scheduler;
}
}
스케줄러 구현
스케줄러 컴포넌트를 만들어서 메서드를 구현하고 @Scheduled 설정을 해주면 끝이에요.
1초마다 현재 시간을 로그에 찍어주는 스케줄러에요.
@Component
public class DemoScheduler {
private static Logger logger = LoggerFactory.getLogger(DemoScheduler.class);
@Scheduled(fixedDelay = 1000)
public void alert() {
logger.info("현재 시간 : {}", new Date());
}
}
설정 파일에서 ThreadPoolTaskScheduler로 생성한 scheduler 객체로 설정을 할 수 있습니다.
필수적으로 설정해야하는 부분은 poolSize 정도가 되겠네요.
위의 두 개 파일이 끝이네요.
부트를 실행시켜 봅니다.
현재 시간이 찍히는 게 보이시죠?
이대로 끝내면 아쉬우니 @Scheduled 속성에 대해서 자세히 알아볼게요.
fixedDelay : 작업이 끝난 시점 기준, milliseconds 마다 동작
fixedDelayString : fixedDelay와 동일, 속성값만 String으로 입력
fixedRate : 작업이 시작한 시점 기준, milliseconds 마다 동작
fixedRateString : fixedRate와 동일, 속성값만 String으로 입력
initialDelay : 최초 수행 지연 시간, milliseconds 이후에 실행
initialDelayString : initialDelay와 동일, 속성값만 String으로 입력
zone : 시간대, Oracle Real-Time Collabaration에서 지원하는 시간대 목록
설정하지 않으면 default는 설치된 서버의 시간대로 설정됨
시간대를 직접 설정해야 할 경우에는 아래 오라클 문서를 참고하시면 되요. (예시: "Asia/Seoul")
https://docs.oracle.com/cd/B13866_04/webconf.904/b10877/timezone.htm
cron : cron 표현식을 사용하여 특정 시간마다 동작 ("초 분 시 일 월 요일" 6필드)
기본적인 Cron Expression에서는 7번째 자리가 연도로 옵션값이지만 스프링에서는 7필드 기입하면 오류가 나요.
또한, Spring Scheduler에서는 L,W와 같은 구문은 쓸 수 없습니다. 빨리 쓸 수 있었으면 좋겠네요...
초 : 0~59
분 : 0~59
시 : 0~23
일 : 1~31
월 : 1~12 혹은 JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
요일 : 1~7 혹은 SUN MON TUE WED THU FRI SAT
* : 모든 값
? : 설정 없음 (일과 요일만 사용 가능)
, : 배열 ex) 1,5,8 : 1,5,8에만
- : 앞부터 뒤까지 ex) 1-3 : 1부터 3까지
/ : 앞부터 뒤마다 ex) 1/3 : 1부터 매3마다 1,4,7,11...
0 0 0 * * * | 매일 00시 |
0 0 19,20 * * MON-FRI | 평일 19시와 20시 |
0 0 9/2 1 * * | 매월 1일 9시부터 매 2시간마다 |
0 30 10 * 6-8 SUN,SAT | 6월~8월 주말 10시 반 |
0/10 * * * * * | 10초마다 |
'Backend > Spring' 카테고리의 다른 글
Spring Boot 파일 업로드 MultipartFile (5) | 2019.10.07 |
---|---|
Spring Boot @Async Callback 비동기처리 (4) | 2019.10.04 |
Spring Boot JPA로 MariaDB 연동 (3) | 2019.08.29 |
Spring Boot 예외처리 @ControllerAdvice - (3) (2) | 2019.08.28 |
Spring Boot 패키지 구조 @Controller @Service - (2) (0) | 2019.08.27 |