스프링 프로젝트를 개발하면서 시스템이 커지고 DB 또는 다양한 서비스를 위해 어떤 모듈들을 주기적으로 실행해야 할 때가 옵니다.
그럴 때 사용하는 것이 스케줄러입니다.
스프링에서 스케줄러 사용방법은 쉽습니다.
servlet-context.xml에서 task namespace를 추가하고 bean을 참조하여 cron 표현식으로 언제 주기적으로 등록한 메서드를 실행할지 선언만 해주면 됩니다.
스프링 프로젝트를 구축하고 간단하게 따라해 봅시다.
1. servlet-context.xml에 scheduled-tasks 추가
servlet-context.xml에 namespace에서 task를 추가합니다.
그럼 <task:
태그를 사용할 수 있게 됩니다.
servlet-context.xml에 다음과 같이 추가합니다.
1
2
|
<task:annotation-driven scheduler="scheduler"/>
<task:scheduler id="scheduler" pool-size="10"/>
|
cs |
물론 context:component-scan도 추가 되어 있어야 합니다.
1
|
<context:component-scan base-package="com.min.edu" />
|
cs |
2. Cron 설정
이제 2가지의 Cron을 세팅하는 방법이 있습니다.
1. servlet-context.xml에서 <task:scheduled-tasks>를 이용해 bean을 등록하여 cron을 설정
2. 직접 bean에서 @Scheduled 어노테이션을 추가하여 cron을 설정
두 방법을 다 알려드리겠습니다.
2-1. servlet-context.xml에서 cron 세팅
아래와 같이 task:scheduled-tasks을 추가하여 task:scheduled안에 bean을 등록합니다.
1
2
3
4
5
|
<task:scheduled-tasks>
<!-- 5초에 1번씩 -->
<task:scheduled ref="cronTest" method="test" cron="0/5 * * * * ?"/> </task:scheduled-tasks>
|
cs |
- ref는 @Component, @Controller, @Service, @Repository 등 stereoType으로 등록된 빈 이름을 추가합니다.
ref에는 반드시 클래스 이름을 camel 명명법으로 입력하세요. - method는 스케줄러로 실행할 메서드명입니다.
- cron 표현식을 사용하여 설정합니다. (cron 표현식은 아래에서 다루겠습니다.)
Cron 표현식으로 이동 🔽
가볍게 CronTest를 추가하여 실행해 봅니다.
package com.min.edu.cron;
import org.springframework.stereotype.Component;
@Component
public class CronTest {
public void test() {
System.out.println("cron 테스트 : 5초에 1번씩 console 찍기");
}
}
2-2. @Scheduled로 cron 세팅
위의 코드에서 @Scheduled Annotation을 추가한 메서드를 추가해 보겠습니다.
package com.min.edu.cron;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class CronTest {
public void test() {
System.out.println("cron 테스트 : 5초에 1번씩 console 찍기");
}
@Scheduled(cron="0/10 * * * * *")
public void test2() {
System.out.println("@Scheduled annotation : 10초에 1번씩 console 찍기");
}
}
cron 표현식을 보면 10초에 1번 실행하도록 설정했습니다.
그리고 바로 실행!
이러한 방법으로 DB도 스케줄링을 통해 주기적으로 쿼리를 실행하는 등 관리할 수 있습니다.
Cron 표현식
출처 : https://madplay.github.io/post/a-guide-to-cron-expression 를 인용하여 설명했습니다.
Cron 표현식의 각 시간단위는 아래의 범위로 구성이 됩니다.
초 | 분 | 시 | 일 | 월 | 요일 | 년도 |
0 ~ 59 | 0 ~ 59 | 0 ~ 23 | 1 ~ 31 | 1 ~ 12 | 0 ~ 6 | *생략가능* |
Cron 표현식 특수문자
- * : 모든 값(매시, 매일, 매주처럼 사용한다.)
- ? : 특정 값이 아닌 어떤 값이든 상관 없음
- - : 범위를 지정할 때
- , : 여러 값을 지정할 때
- / : 증분값, 즉 초기값과 증가치를 설정할 때
- L : 지정할 수 있는 범위의 마지막 값 표시
- W : 가장 가까운 평일(weekday)을 설정할 때
- # : N번 째 특정 요일을 설정할 때
예제
매 10분마다 0 0/10 * * * *
매 3시간마다 0 0 0/3 * * *
2018년도 매일 14시 30분마다 0 30 14 * * * 2018
매일 10시 ~ 19시 사이에 10분 간격으로 0 0/10 10-19 * * *
매일 10시와 19시에만 10분 간격으로 0 0/10 10,19 * * *
매달 25일 01시 30분에 0 30 1 25 * *
매주 월, 금요일 10시와 19시 사이 10분마다 0 10 10-19 ? * MON,FRI
매달 마지막날 15시 30분 0 30 15 L * *
2017~2018년 매월의 마지막 토요일 오후 1시 20분 0 20 13 ? * 6L 2017-2018
CronMaker
위의 링크를 통해 Cron을 쉽게 작성할 수 있습니다.
참고링크
https://en.wikipedia.org/wiki/Cron#CRON_expression
https://zamezzz.tistory.com/197
'개발 아카이브 > Spring' 카테고리의 다른 글
[Spring] @Autowired를 지혜롭게 하는 법. (0) | 2021.10.21 |
---|