Spring Boot Scheduler

김형준 Kim Hyeong Jun·2023년 2월 16일
0
post-thumbnail

0. 스케쥴러란?

특정 메소드에 @Scheduled 애노테이션을 선언하면 설정한 값에 따라 주기적(일정한 시간 간격, 혹은 특정 시간)으로 해다 메소드를 실행시킬 수 있다.

본인이 진행한 프로젝트에서는

  1. 당일을 기준으로 잡고
  2. 이전 날짜로 마감된 설문이 존재하면
  3. 마감된 설문의 작성자에게 알림 메일을 발송한다.

라는 계획을 가지고 메소드를 작성하였고, 일정 주기마다 해당 메소드가 실행될 수 있도록 스케쥴러에 대해서 알아보고 사용하였다.

1. 스케쥴러 사용

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);
    }
}

2. 스케쥴러 속성

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번째주 수요일)

Reference

https://dejavuhyo.github.io/posts/spring-boot-scheduler/
https://bamdule.tistory.com/222
https://dev-coco.tistory.com/176
http://www.cronmaker.com/?1

profile
I want be a developer🙂

0개의 댓글