티스토리 뷰

Java

Spring 스케줄링 (@Scheduled)

토마's 2016. 12. 18. 11:59

안녕하세요. 오늘은 제가 프로젝트 진행 중에 스프링에서 스케줄링 하는 방법에 대해서 알게 되어서 기록을 남기고 제가 모를때 다시 참조하거나

혹시 저와 같이 모르는 분들에게 도움이 되고자 포스팅을 하려고 합니다. :)

즉, 우리는 종종 프로젝트를 진행하다 보면 스케줄러(일명 : 배치 크론탭)을 사용할 때가 있습니다.


스케줄링을 하기 위해서 스케줄링을 하기 위한 메소드 위에 @Scheduled이라는 어노테이션을 선언해주면 됩니다.


그리고 @Scheduled( cron="*/30 * * * * *" )

위와 같이 선언하게 되면 30초 마다 실행되는 것입니다.



자 그럼 여기서 cron 표현식에 대해서 알아보겠습니다.

필드 이름 

허용 값 

 초(seconds)

 0 ~ 59

 분(minutes)

 0 ~ 59

 시(hours)

 0 ~ 23

 날(day-of-month)

 1 ~ 31

 달(month)

 1 ~ 12 or JAN ~ DEC

 요일(day-of-week) 

 1 ~ 7 or SUN-SAT

 년도

 빈값, 1970 ~ 2099



cron표현식의 특수문자

 표현식

설명 

예시 

 *

 모든 수를 나타냄

 

 -

 값의 사이를 의미 

 * 10-13 * * * * 10,11,12,13분에 동작함

 ,

 특정값 지칭 

 * 10,11,13 * * * * 10,11,13분에 동작함

 /

 값의 증가를 표현

 * 0/5 * * * * 0분부터 시작해서 5분마다 동작

 ?

 특별한 값이 없음을 나타냄(day-of-month, day-of-week 필드만 사용)

 

 L

 마지막 날을 나타냄(day-of-month, day-of-week 필드만 사용) 

 


그럼 위의 표현식을 사용한 예제에 대해서 알아보겠습니다.

예제)

초 분 시 일 월 주(년)

 "0 0 02 * * ?" : 매일 새벽 두시

 "0 0 12 * * ?" : 아무 요일, 매월, 매일 12:00:00

 "0 15 10 ? * *" : 모든 요일, 매월, 아무 날이나 10:15:00 

 "0 15 10 * * ?" : 아무 요일, 매월, 매일 10:15:00 

 "0 15 10 * * ? *" : 모든 연도, 아무 요일, 매월, 매일 10:15 

 "0 15 10 * * ? : 2005" 2005년 아무 요일이나 매월, 매일 10:15 

 "0 * 14 * * ?" : 아무 요일, 매월, 매일, 14시 매분 0초 

 "0 0/5 14 * * ?" : 아무 요일, 매월, 매일, 14시 매 5분마다 0초 

 "0 0/5 14,18 * * ?" : 아무 요일, 매월, 매일, 14시, 18시 매 5분마다 0초 

 "0 0-5 14 * * ?" : 아무 요일, 매월, 매일, 14:00 부터 매 14:05까지 매 분 0초 

 "0 10,44 14 ? 3 WED" : 3월의 매 주 수요일, 아무 날짜나 14:10:00, 14:44:00 

 "0 15 10 ? * MON-FRI" : 월~금, 매월, 아무 날이나 10:15:00 

 "0 15 10 15 * ?" : 아무 요일, 매월 15일 10:15:00 

 "0 15 10 L * ?" : 아무 요일, 매월 마지막 날 10:15:00 

 "0 15 10 ? * 6L" : 매월 마지막 금요일 아무 날이나 10:15:00 

 "0 15 10 ? * 6L 2002-2005" : 2002년부터 2005년까지 매월 마지막 금요일 아무 날이나 10:15:00 

 "0 15 10 ? * 6#3" : 매월 3번째 금요일 아무 날이나 10:15:00


그럼 예제를 통해서 Spring 스케줄링 사용법에 대해서 알아보겠습니다.


먼저 Spring 설정 파일인 root-context를 아래와 같이 변경시켜 줍니다. class는 실제 파일이 위치한 곳을 잡아주면 됩니다.


<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"

 xmlns:task="http://www.springframework.org/schema/task"

 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd

        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd

        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

 <bean id="scheduleService" class="com.spring.scheduler.Scheduler" />

 <task:scheduler id="gsScheduler" pool-size="10" />

 <task:executor id="gsTaskExecutor" pool-size="10" />

 <task:annotation-driven executor="gsTaskExecutor"

  scheduler="gsScheduler" />


<!-- Root Context: defines shared resources visible to all other web components -->

</beans>



그리고 나서 자바 소스를 통해 매일 45분마다 실행되도록 설정했습니다.

@Component
public class Scheduler {

	@Scheduled(cron = "0 45 * * * *")
	public void cornTest() {
		System.out.println("매일 45분에 실행됩니다.");
	}
}


그리고 45분이 되면 다음과 같은 결과창을 화면에 띄워줍니다.



정상적으로 스케줄링 된 소스가 실행된 것을 확인할 수 있습니다.

오늘의 포스팅은 여기까지고 다음에도 배운것을 토대로 도움이 될만한 것들을 계속적으로 포스팅하도록 하겠습니다.

감사합니다 :)