본문 바로가기

Backend/Spring

Spring Boot Scheduler @Scheduled 사용

스프링 부트에서 스케줄러를 돌려서 일정 시간마다 혹은 일정 시간에 로직을 수행하는 방법을 알아볼게요.

설정 파일

스프링 부트에서 스케줄러 기능을 사용하기 위해 @EnableScheduling 설정을 해줄게요.

 

@Configuration
@EnableScheduling
public class ScheduledConfig {

	@Bean
	public TaskScheduler scheduler() {
		ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
		scheduler.setPoolSize(4);
		return scheduler;
	}

}

스케줄러 구현

스케줄러 컴포넌트를 만들어서 메서드를 구현하고 @Scheduled 설정을 해주면 끝이에요.

1초마다 현재 시간을 로그에 찍어주는 스케줄러에요.

 

@Component
public class DemoScheduler {
	
	private static Logger logger = LoggerFactory.getLogger(DemoScheduler.class);
	
	@Scheduled(fixedDelay = 1000)
	public void alert() {
		logger.info("현재 시간 : {}", new Date());
	}

}

 

설정 파일에서 ThreadPoolTaskScheduler로 생성한 scheduler 객체로 설정을 할 수 있습니다.

필수적으로 설정해야하는 부분은 poolSize 정도가 되겠네요.

 

 

위의 두 개 파일이 끝이네요.

부트를 실행시켜 봅니다.

현재 시간이 찍히는 게 보이시죠?

 


이대로 끝내면 아쉬우니 @Scheduled 속성에 대해서 자세히 알아볼게요.

 

 

fixedDelay : 작업이 끝난 시점 기준, milliseconds 마다 동작

fixedDelayString : fixedDelay와 동일, 속성값만 String으로 입력

fixedRate : 작업이 시작한 시점 기준, milliseconds 마다 동작

fixedRateString : fixedRate와 동일, 속성값만 String으로 입력

initialDelay : 최초 수행 지연 시간, milliseconds 이후에 실행

initialDelayString : initialDelay와 동일, 속성값만 String으로 입력

 

zone : 시간대, Oracle Real-Time Collabaration에서 지원하는 시간대 목록

설정하지 않으면 default는 설치된 서버의 시간대로 설정됨

시간대를 직접 설정해야 할 경우에는 아래 오라클 문서를 참고하시면 되요. (예시: "Asia/Seoul")

https://docs.oracle.com/cd/B13866_04/webconf.904/b10877/timezone.htm

 

A Time Zones

A Time Zones The following table contains a list of time zones supported by Oracle Real-Time Collaboration. See "Property to Configure Time Zones" for details about setting the default time zone for a Web Conferencing system. Table A-1 Real-Time Collaborat

docs.oracle.com

cron : cron 표현식을 사용하여 특정 시간마다 동작 ("초 분 시 일 월 요일" 6필드)

기본적인 Cron Expression에서는 7번째 자리가 연도로 옵션값이지만 스프링에서는 7필드 기입하면 오류가 나요.

또한, Spring Scheduler에서는 L,W와 같은 구문은 쓸 수 없습니다. 빨리 쓸 수 있었으면 좋겠네요...

 

초 : 0~59
분 : 0~59
시 : 0~23
일 : 1~31
월 : 1~12 혹은 JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
요일 : 1~7 혹은 SUN MON TUE WED THU FRI SAT

 

* : 모든 값
? : 설정 없음 (일과 요일만 사용 가능)
, : 배열 ex) 1,5,8 : 1,5,8에만
- : 앞부터 뒤까지 ex) 1-3 : 1부터 3까지
/ : 앞부터 뒤마다 ex) 1/3 : 1부터 매3마다 1,4,7,11...

 

 0 0 0 * * *  매일 00시
 0 0 19,20 * * MON-FRI  평일 19시와 20시
 0 0 9/2 1 * *  매월 1일 9시부터 매 2시간마다
 0 30 10 * 6-8 SUN,SAT  6월~8월 주말 10시 반
 0/10 * * * * *  10초마다