Spring

스프링 스케줄러(Scheduler) 사용하기

삑삑도요 2022. 11. 28. 00:27

프로그램을 만들다 보면 일정 시간마다 특정 작업을 반복해서 수행시켜야하는 경우가 종종 생긴다.

 

예를 들어 한 시간마다 한 번씩 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초....

 

 

이제 스케줄러 어노테이션을 붙인 메서드에, 반복 수행하고 싶은 작업을 작성하면 지정한 조건에 맞춰 반복 수행된다!