특정 메소드에 @Scheduled
애노테이션을 선언하면 설정한 값에 따라 주기적(일정한 시간 간격, 혹은 특정 시간)으로 해다 메소드를 실행시킬 수 있다.
본인이 진행한 프로젝트에서는
- 당일을 기준으로 잡고
- 이전 날짜로 마감된 설문이 존재하면
- 마감된 설문의 작성자에게 알림 메일을 발송한다.
라는 계획을 가지고 메소드를 작성하였고, 일정 주기마다 해당 메소드가 실행될 수 있도록 스케쥴러에 대해서 알아보고 사용하였다.
1️⃣ Application 클레스에 @EnableScheduling
애노테이션을 추가하면 스케쥴러 기능을 사용할 수 있다.
package com.formmaker.fff;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling
@SpringBootApplication
public class FffApplication {
public static void main(String[] args) {
SpringApplication.run(FffApplication.class, args);
}
}
2️⃣ 실제 스케쥴링 작업을 할 클래스를 만든다.
해당 클래스는 @Component
즉, 스프링 빈에 등록된 클래스여야 한다.
package com.formmaker.fff.mail.controller;
import com.formmaker.fff.mail.service.MailService;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.mail.MessagingException;
import java.io.UnsupportedEncodingException;
@RestController
@RequestMapping("/api/user")
@RequiredArgsConstructor
public class MailController {
private final MailService mailService;
@Scheduled(cron = "0 30 8 * * *")
public void surveyFinishNotice() throws MessagingException, UnsupportedEncodingException {
String msg = mailService.sendFinishMessage();
log.info(msg);
}
}
1️⃣ fixedDelay : ms(milliseconds) 단위로 이전 Task의 종료 시점으로부터 정의된 시간만큼 지난 후 Task를 실행
2️⃣ fixedDelayString : fixedDelay와 동일. 단, 문자열로 값(value)을 표현하겟다는 의미
3️⃣ fixedRate : ms 단위로 이전 Task의 시작 시점으로부터 정의된 시간만큼 지난 후 Task를 실행
4️⃣ fixedRateString : fixedRate와 동일. 단, 문자열로 값을 표현하겠다는 의미
5️⃣ initialDelay : 스케쥴러에서 메소드가 동록되자마자 수행하는 것이 아닌 초기 지연시간을 설정하는 것
6️⃣ initialDelayString : initialDelay와 동일. 단, 문자열로 값을 표현하겠다는 의미
7️⃣ cron : cron 표현식을 사용하여 작업을 예약
요일(0-6) (0: 일, 1: 월, 2:화, 3:수, 4:목, 5:금, 6:토)
cron 표현식
* : 모든 조건(매시, 매일, 매주처럼 사용)을 의미
? : 설정값 없음(날짜와 요일에만 사용 가능)
- : 범위를 지정할 때
, : 여러 값을 지정할 때
/ : 증분값, 즉 초기값과 증가치 설정에 사용 (예 - 0/2 : 0분 부터 매 2분)
L : 마지막 - 지정할 수 있는 범위의 마지막 값 설정 시 사용(날짜와 요일에만 사용 가능)
W : 가장 가까운 평일을 설정할 때 (예 - 10W : 10일과 가장 가까운 평일)
# : 몇째주의 무슨 요일을 표현 (예 - 3#2 : 2번째주 수요일)
https://dejavuhyo.github.io/posts/spring-boot-scheduler/
https://bamdule.tistory.com/222
https://dev-coco.tistory.com/176
http://www.cronmaker.com/?1