스프링 스케줄러(Scheduler) 사용하기
프로그램을 만들다 보면 일정 시간마다 특정 작업을 반복해서 수행시켜야하는 경우가 종종 생긴다.
예를 들어 한 시간마다 한 번씩 DB에 update를 수행해야하는 경우가 있겠다.
Spring에서는 Scheduler를 이용하면 그러한 반복작업을 자동으로 수행할 수 있다!
1. Scheduler 준비
Scheduler를 사용하려면 우선 Scheduler를 bean 태그에 작성해서 bean으로 인식시켜야 한다.
bean 등록은 servlet관련 설정을 입력하는 xml 파일에서 할 수 있다.
내 경우 servlet-context.xml 파일에 관련 구문을 작성해주었다.
1-1) servlet-context.xml의 상단 beans 태그에 다음 구문 추가
xmlns:task="http://www.springframework.org/schema/task"
1-2) servlet-context.xml의 상단 beans 태그 내 xsi:schemaLocation에 다음 구문 추가
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd
1-3) servlet-context.xml 파일 내 다음 구문 추가
<context:component-scan base-package="패키지 경로" />
<task:scheduler id="jobScheduler" pool-size="10"/>
<task:annotation-driven scheduler="jobScheduler"/>
base-package에 스케줄러를 사용한 클래스가 있는 패키지의 경로를 작성해서 해당 패키지가 bean으로 스캔될 수 있도록 한다.
그리고 @scheduler 어노테이션을 사용할 수 있게 annotation-driven에 scheduler를 작성한
이렇게만 작성하면 Scheduler 준비는 끝난다!
2. Scheduler 클래스 작성
이제 앞서 작성한 패키지에 Scheduler를 사용할 클래스를 생성하면 된다.
아래는 예시로 만들어 본 클래스이다.
@Component
public class Scheduler {
@Scheduled(cron = "0 0/1 * * * *")
public void sample() {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
System.out.println("Scheduler 수행 (" + sdf.format(date) + ")");
}
}
먼저 Scheduler를 사용할 클래스를 생성한 후, @Component로 등록한다.
클래스 내에 메서드를 작성한 다음, @Scheduled 어노테이션을 달아준다.
그리고 @Scheduled 어노테이션 옆에 반복수행 조건을 작성해준다.
@Scheduled(cron = "0 0/1 * * * *")
이때 사용되는 표현식을 '크론(Cron) 표현식'이라고 한다.
[초] [분] [시간] [일] [월] [요일] {연도}
대략적인 규칙은 다음과 같다.
(1) 연도는 생략할 수 있다.
(2) * 은 해당 항목에서 사용 가능한 모든 조건을 의미한다.
- 예를 들어 [시간]에 *을 작성하면 0시, 1시, 2시.... 23시, 24시까지, 매 시간이 조건으로 인식된다.
(3) 각 항목에 0/를 작성한 후 시간을 작성하면, 해당 시간마다 반복되는 조건이 만들어진다.
- 예를 들어 [분]에 0/10이라고 작성하면, 10분마다 반복되게 된다.
(4) 일과 요일은 동시에 설정할 수 없다. 어느 한쪽을 설정한 경우, 다른 쪽에 ?를 작성해준다
예시 1) 0 0/1 * * * *
- 매년, 매월, 매일, 매시간, 0초를 기준으로 1분마다 반복 수행된다.
- 오전 12시 0분 0초, 오전 12시 1분 0초, 오전 12시 2분 0초....
이제 스케줄러 어노테이션을 붙인 메서드에, 반복 수행하고 싶은 작업을 작성하면 지정한 조건에 맞춰 반복 수행된다!