Scheduler
Spring Boot에서 Scheduler는 일정한 주기나 시점에 특정 작업을 자동으로 실행하기 위한 기능이다.
우리가 사용하는 카카오톡을 보면 00님의 생일 정보가 뜨는 것을 볼 수 있을 것이다.
또한, 회사에서 연차 시스템 등의 기능을 구현하기 위해 Scheduler 이 필요하다.
Scgeduler 는 spring-boot-starter 패키지에 기본적으로 포함되어 있어 Spring Boot 프로젝트에서 별도의 의존성을 추가하지 않아도 사용이 가능하다.
❌ 주의할 점은 서버와 라이프사이클을 같이 하기 때문에 서버를 끄지 전까지는 계속 켜져있게 된다. (데몬스레드 → 스케쥴러도 뜯어보면 스레드로 만들어져 있다.)
▶ setInterval 은 화면이 켜져있어야 돌아가지만 Scheduler 은 서버가 꺼지기 전까지 계속 돌아간다.
사용할 클래스에 @EnabledScheduling 을 추가하고,
사용할 메서드에 @Scheduled 메서드를 사용해 동작할 수 있도록 한다.
사용 방법
@Scheduled(fixedDelay=1000) : 이전 작업이 종료된 후 설정 시간 이후에 다시 시작 (이전 작업이 진행중이면 기다리고 끝나면 1초 기다리고 실행함)
@Scheduled(fixedRate=1000) : 설정된 시간마다 시작을 한다. (이전 작업이 종료되지 않아도 실행하기 때문에 중복될 수 있다.)
@Scheduled(cron="******") : 초(0~59), 분(0~59), 시(0~23), 일(1~31), 월(1~12), 요일(0~7)을 지정할 수 있기 때문에 상세하게 반복 주기를 잡아줄 수 있다.
▶ "5 * * * * MON-FRI" : 이렇게 하면 1분 5초 2분 5초 3분 5초로 진행된다.
▶ "0/5 * * * * MON-FRI" : 이렇게 적어줘야 5초 마다가 된다.
보통 스케쥴러를 만들 때에는 동일한 프로젝트 안에 넣기도 하지만 스케쥴러를 돌릴 프로젝트를 따로 만들어 주기도 한다.
뭔가 알림을 줄 때 많이 사용한다.
스케쥴러를 만들 때에도 빈 등록 작업을 해줘야 한다.
컨드롤러는 @Controller 서비스는 @Service 를 선언하고, 그 외에는 @Component 를 선언한다.
(서비스 : 실질적으로 일을 하는 것)
@Component 는 컨트롤러도 아니고 서비스도 아닌 성격의 기능을 담당하는 클래스에 사용을 해준다.
원래는 컨트롤러와 컴포넌트만 있었는데 너무 많은 곳에서 컴포넌트를 사용하다 보니 서비스를 만든 것이다.
컴포넌트는 아래의 경우에 사용한다.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@EnableScheduling
@Component
public class TestScheduler {
Logger logger = LoggerFactory.getLogger(getClass());
@Scheduled(fixedDelay = 1000)
public void fixedDelay() {
logger.info("작업이 끝나고, 1초 후 실행");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Scheduled(fixedRate = 1000)
public void fixedRate() {
logger.info("1초 마다 실행");
}
@Scheduled(cron = "0/5 * * * * MON-FRI")
public void cron() {
logger.info("5초 마다 실행");
}
}
필드명 | 값의 허용 범위 | 허용된 특수문자
초 (Seconds) | 0 ~ 59 | , - * /
분 (Minutes) | 0 ~ 59 | , - * /
시 (Hours) | 0 ~ 23 | , - * /
일 (Day) | 1 ~ 31 | , - * ? / L W
월 (Month) | 1 ~ 12 or JAN ~ DEC | , - * /
요일 (Week) | 0 ~ 6 or SUN ~ SAT(7도 일요일) | , - * ? / L #
연도 (Year) | empty or 1970 ~ 2099 | , - * /
Cron 표현식 - 특수문자
* : 모든 값을 뜻합니다.? : 특정한 값이 없음을 뜻합니다. - : 범위를 뜻합니다. (예) 월요일에서 수요일까지는 MON-WED로 표현, : 특별한 값일 때만 동작 (예) 월,수,금 MON,WED,FRI / : 시작시간 / 단위 (예) 0분부터 매 5분 0/5L : 일에서 사용하면 마지막 일, 요일에서는 마지막 요일(토요일)W : 가장 가까운 평일 (예) 15W는 15일에서 가장 가까운 평일 (월 ~ 금)을 찾음# : 몇째주의 무슨 요일을 표현 (예) 3#2 : 2번째주 수요일Cron Maker : http://www.cronmaker.com/cron 표현식을 생성해주는 사이트