본문 바로가기

Spring 3.0 - 4.3

Quartz 라이브러리 이용하기 (특정 시간에 특정 프로그램을 실행하고 싶을 때)

 

Quartz 라이브러리는 일반적으로 스케줄러를 구성하기 위해 사용합니다.

서버를 운영하기 위해서는 간혹 매일, 매주, 매월 주기적으로 특정한 프로그램을 실행 할 필요가 있습니다.

이 작업은 운영체제의 기능을 이용해서 작업할 수도 있지만, 스프링과 Quartz 라이브러리를 이용하면 간단하게 처리할 수 있습니다.

 

※ Spring Batch의 경우 많은 양의 데이터를 주기적으로 읽고 쓰는 작업에는 유용하지만 설정이 더 복잡합니다.

 

 

사용 방법

1. pom.xml 에 quartz 관련 라이브러리를 추가해줍니다.

		<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
		<dependency>
		    <groupId>org.quartz-scheduler</groupId>
		    <artifactId>quartz</artifactId>
		    <version>2.3.0</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz-jobs -->
		<dependency>
		    <groupId>org.quartz-scheduler</groupId>
		    <artifactId>quartz-jobs</artifactId>
		    <version>2.3.0</version>
		</dependency>

 

 

2. Quartz에 대한 설정을 하기 위해 XML과 어노테이션을 이용합니다.

root-context.xml의 네임스페이스에 task 항목을 체크합니다 (아래 탭을 보시면 Namespace라고 있습니다.)

 

 

root-context.xml 에는 <task:annotation-driven>을 추가합니다.

 

 

3. 스케줄링 할 작업은 별도로 패키지를 생성해서 그 안에서 로직을 처리합니다.

 

com.exe.task라는 스케줄링을 처리할 별도의 패키지를 생성했습니다.

 

 

CrawlingTask 에는 @Component 어노테이션과 @Scheduled 어노테이션이 사용되었습니다.

@Scheduled 어노테이션 내에는 cron 이라는 속성을 부여해서 주기를 제어합니다.

로그가 정상적으로 기록되는지 확인하기 위해서 log.warn() 레벨을 이용해서 실행 중에 확인할 수 있돌고 합니다. (@Log4j 어노테이션 이용)

 

@Log4j 는 lombok을 이용해서 로그를 기록하는 Logger를 변수로 생성합니다. 별도의 Logger 객체의 선언이 없어도 Log4j 라이브러리와 설정이 존재한다면 바로 사용할 수 있습니다. 'Spring Legacy Project' 로 생성하는 경우 기본으로 Log4j와 해당 설정이 완료되는 상태이기 때문에 별도의 처리 없이도 사용이 가능합니다.

 

 

우선 CrawlingTask 가 정상적으로 동작하는지 확인하기 위해서 root-context.xml 에 CrawlingTask를 스프링의 빈으로 설정합니다.

(저의 경우 "com.exe.*" 로 설정해서 모든 패키지를 스캔하도록 했습니다.)

<context:component-scan base-package="com.exe.task" />

 

 

서버를 키고 나면, 매 분마다 console 창에 로그가 찍히는 걸 볼 수 있습니다.

 

 

※ 여기서 cron 설정에 대해 잠시 설명하자면,

Cron은 원래 유닉스 계열에서 사용되는 스케줄러 프로그램의 이름이지만, 워낙 많이 사용되다 보니 각종 언어나 기술에 맞는 라이브러리 형태로 사용됩니다.

 

@Scheduled(cron="0 * * * * *") 의 의미는 '매분 0초가 될 때 마다 실행한다' 로 해석할 수 있습니다.

@Scheduled(cron="0 0 2 * * *") 의 의미는 '매일 새벽 2시에 동작한다' 로 해석할 수 있습니다.

 

cron 표현식

요일의 경우 1: 일요일 2: 월요일 ... 7: 토요일 입니다