# 주기적 메소드 수행하기
@Scheduled 애노테이션을 사용하면 주기적 메소드 수행이 가능합니다.
## 학습목표
주기적 메소드 수행방법을 익힌다.
## 목차
1. 설정하기
2. 테스트
3. cron 표현식
## 설정하기
@Scheduled를 사용하려면 기본 설정이 필요합니다.
### task-context.xml
해당 위치에,
![Imgur](https://i.imgur.com/fDQhp3L.png)
다음 코드를 작성.
```
<?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:task="http://www.springframework.org/schema/task"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 관련 컴포넌트를 해당 패키지에서 스캔. -->
<context:component-scan base-package="com.mycompany.task" />
<!-- 애노테이션 기반 동작 가능. -->
<task:annotation-driven/>
</beans>
```
### web.xml
위에서 작성한 설정파일 위치를 등록합니다.
```
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- 변경전: root-context.xml -->
<param-value>/WEB-INF/spring/*-context.xml</param-value>
</context-param>
```
## 테스트
잘 동작하는지 확인해봅시다.
### 클래스 작성
클래스를 작성합니다.
src/main/java
```
package com.mycompany.task;
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class Crawler {
@Scheduled(fixedRate = 2000) // 수행 시작 기점, 2초 후 실행
public void fixedRateTest() {
System.out.println("fixedRate: 2sec -> " + new Date());
}
@Scheduled(fixedDelay = 7000) // 수행 종료 기점, 7초 후 실행
public void fixedDelayTest() {
System.out.println("fixedDelay: 7sec -> " + new Date());
}
@Scheduled(cron = "0 0 13 * * *") // 매일 13시 수행
public void cronTest() {
System.out.println("cron: 0 0 13 * * * -> " + new Date());
}
}
```
아래와 같은 콘솔 출력이 되면 오케이!
```
fixedRate: 2sec -> Fri Aug 24 12:14:09 KST 2018
fixedRate: 2sec -> Fri Aug 24 12:14:11 KST 2018
fixedDelay: 7sec -> Fri Aug 24 12:14:11 KST 2018
fixedRate: 2sec -> Fri Aug 24 12:14:13 KST 2018
fixedRate: 2sec -> Fri Aug 24 12:14:15 KST 2018
fixedRate: 2sec -> Fri Aug 24 12:14:17 KST 2018
fixedDelay: 7sec -> Fri Aug 24 12:14:18 KST 2018
fixedRate: 2sec -> Fri Aug 24 12:14:19 KST 2018
...
```
## cron 표현식
스케쥴 작업 수행히 cron 표현식을 사용하면 편리합니다.
### 사용 예
```
@Scheduled(cron = "0 0 12 * * *") // 매일 12시 실행
@Scheduled(cron = "0 15 10 * * *") // 매일 10시 15분 실행
@Scheduled(cron = "0 * 14 * * *") // 매일 14시에 0분~59분까지 매분 실행
@Scheduled(cron = "0 0/5 14 * * *") // 매일 14시에 시작해서 5분 간격으로 실행
@Scheduled(cron = "0 0/5 14,18 * * *") // 매일 14시, 18시에 시작해서 5분 간격으로 실행
@Scheduled(cron = "0 0-5 14 * * *") // 매일 14시에 0분, 1분, 2분, 3분, 4분, 5분에 실행
@Scheduled(cron = "0 0 20 ? * MON-FRI") // 월~금일 20시 0분 0초에 실행
@Scheduled(cron = "0 0/5 14 * * ?") // 아무요일, 매월, 매일 14:00부터 14:05분까지 매분 0초 실행 (6번 실행됨)
@Scheduled(cron = "0 15 10 ? * 6L") // 매월 마지막 금요일 아무날이나 10:15:00에 실행
@Scheduled(cron = "0 15 10 15 * ?") // 아무요일, 매월 15일 10:15:00에 실행
@Scheduled(cron = "* /1 * * * *") // 매 1분마다 실행
@Scheduled(cron = " * /10 * * * *") // 매 10분마다 실행
```
### 표현식 의미
문자열의 좌측에서 우측으로 순서별 의미가 존재합니다. 구분자는 space입니다.
| 순서 | 필드명 | 사용 가능 값 |
|:----:|:--------|:-------------|
| 1 | seconds | 0~59, - * / |
| 2 | minutes | 0~59, - * / |
| 3 | hours | 0~23, - * / |
| 4 | day of month | 1~31, - * ? / L W |
| 5 | month | 1~12 or JAN-DEC, - * / |
| 6 | day of week | 1-7 or SUN-SAT, - * ? / L # |
| 7 | years (optional) | 1970~2099, - * / |
### 특수문자 의미
| 기호 | 의미 | 사용 예 |
|:-----:|:----|:---------|
| * | 모든 수 | 매초, 매분, 매시간 |
| ? | 해당 항목 사용안함 | 날짜, 요일 미지정 |
| - | 기간 설정 | 10-12: 10시, 11시, 12시 |
| , | 특정 시각 | 2,4,6: 월, 수, 금 동작 |
| / | 반복 | 5/15: 5초에 시작하여 15초 간격으로 동작 |
| L | 마지막 기간 | 해당월 마지막날, 해당 주 마지막(토) |
| W | 가장 가까운 평일 | 15W: 15일기준으로 가장 가까운 평일날 수행 |
| LW | L과 W의 조합 | 그 달의 마지막 평일에 동작 |
| # | 몇 째 주와 요일 설정 | 6#3: 3번째 주 금요일, 4#2 2번째 주 수요일 |