민우의 코딩일지
article thumbnail

 

@Scheduled  어노테이션

소개

 

서버가 실행되고있을때 원하는 주기마다 코드를 실행할 수 있도록 해주는 어노테이션이다.

매월이나 매주 혹은 매일마다 실행되게할 수 있어서 유용하다.

쓰레드, 비동기 등 .. 더 자세한 내용은 이번 포스팅에서 다루지않았지만, 다음에 필요시 다룰 예정이다.

 

 

필요 디펜던시

 

별도 설치가 필요없다.

왜냐면, 스프링 부트에서 기본 제공하는 spring-boot-starter-web 디펜던시를 사용하기때문이다.

 

 

세팅 방법

 

MainApplication 클래스 파일에서 @EnableScheduling 어노테이션만 추가해주면 끝.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableScheduling
@SpringBootApplication
public class MainApplication {
	public static void main(String[] args) {
		SpringApplication.run(MainApplication.class, args);
	}
}

 

 

🔍 사용 예시

매일마다 실행

@Component
public class SchedulerServiceImpl {

    /* 서버 실행시 최초 실행되고 */
    @PostConstruct
    public void init() {
        executeTask();
    }

    /* 그리고, 매일 자정마다 실행 */
    @Scheduled(cron = "0 0 0 * * *")
    public void executeDailyTask() {
        executeTask();
    }

     /* 실행될 내용 */
    private void executeTask() {
        // ... 
    }

}

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

Scheduled 속성

기본

@Component
public class 클래스명 {

    @Scheduled(속성 = 속성값)
    private void 메소드명() {
        /* ... 실행될 내용 ... */
    }

}

 

 

fixedDelay, fixedDelayString

 

기존 스케줄 작업이 완전히 종료될 때까지 기다리고, 설정된 N초후 다시 반복된다.

@Component
public class 클래스명 {

    @Scheduled(fixedDelay = 1_000) // 1,000밀리초 -> 1초 단위로 동작 
    private void 메소드명() {
        /* ... 실행될 내용 ... */
    }
    
    /*
    
    	만약, 숫자 대신 문자열을 입력하고싶다면 
        fixedDelay 대신 fixedDelayString 속성을 이용할 수 있다.
        
        예시)
        
        @Scheduled(fixedDelayString = "1000") // 1,000밀리초 -> 1초 단위로 동작
    	private void 메소드명() {
        	// ... 실행될 내용 ... 
    	}
    
    */

}

 

fixedRate, fixedRateString

 

기존 스케줄 작업이 완전히 종료될 때까지 기다리지않고, 무조건 N초 단위로 반복된다.

스케줄러의 간격보다, 스케줄 내용이 완료되는 시간이 더 소요될경우 안전성을 보장할 수 없다는 단점이 있다.
ex 1) 스케줄러 간격이 1초인데,  그때마다 실행될 내용이 1초 이상으로 소요될경우
ex 2) 스케줄러 간격 1초,  그때마다 동작될 메소드의 실행 완료까지 소요시간 3초

참고 문서) https://seriouskang.tistory.com/2 게시글의  " 3. fixedRate vs fixedDelay " 내용

 

@Component
public class 클래스명 {

    @Scheduled(fixedDelay = 1_000) // 1,000밀리초 -> 1초 단위로 동작
    private void 메소드명() {
        /* ... 실행될 내용 ... */
    }
    
    /*
    
    	만약, 숫자 대신 문자열을 입력하고싶다면 
        fixedDelay 대신 fixedDelayString 속성을 이용할 수 있다.
        
        예시)
        
        @Scheduled(fixedDelayString = "1000") // 1,000밀리초 -> 1초 단위로 동작
    	private void 메소드명() {
        	// ... 실행될 내용 ... 
    	}
    
    */

}

 

initialDelay

 

서버가 실행된 그 즉시가 아니라, 원하는 시간만큼 지난 이후부터 스케줄러가 작동되게할 수 있다.

그래서 해당 속성은 위의 fixedRate 혹은 fixedDelay 속성을 함께 이용할 수 있다.

@Component
public class 클래스명 {

    @Scheduled(fixedRate = 3_000, initialDelay = 5_000) // 서버 실행되고 5초 이후부터, 매 3초 단위로 실행
    private void 메소드명() {
        /* ... 실행될 내용 ... */
    }

	// 참고) fixedRate 대신 fixedDelay를 사용할 수 있다.

}

 

cron

 

얼핏보면, 리눅스의 crontab과 비슷하지만 조금 다르다.

요일의 0, 7은 각각 일요일을 뜻하며, 1 월요일부터 ~ 6 토요일로 구성되어있다.
@Component
public class 클래스명 {

    @Scheduled(cron = "[초: 0-59] [분: 0-59] [시: 0-23] [일: 1-31] [월: 1-12] [요일: 0-7]")
    private void 메소드명() {
        /* ... 실행될 내용 ... */
    }
}

 

 

cron 필드에서 사용가능한 메타 문자

 

필드명 범위 사용 가능한 메타 문자
0-59 , - * /
0-59
0-23
1-31 , - * / L W
1-12 , - * /
요일 0-7 , - * ? / L #

 

cron 필드에서 사용되는 메타 문자 설명

 

메타 문자 설명 예시
* 모든 값  
? 특정 한 값이 없음  
- 언제부터 언제까지를 표현할때 사용 월요일부터 수요일까지 표현 -> MON-WED 
, 다중 조건을 표현할때 사용 월 수 금 표현 -> MON,WED,FRI
/ 시작 단위 / 그 이후 오후6시부터 1시간마다 -> 18/1
L 해당 단위의 가장 마지막 (일, 월)  
W 가장 가까운 평일 15일에서 가장 가까운 평일 -> 15W
# 몇째 주의 무슨 요일을 표현 2번째주 수요일(3) -> 3#2

 

 

 

 

 

 

 

 

 

 

 

 

참고 문서

 

쓰레드 관련 내용

 

[Spring] 주기적인 작업 구현하기(feat. Scheduling Tasks)

최근에 어플리케이션이 기동되는 동안 주기적으로 특정 작업이 수행되어야 한다는 요구사항이 있었다. 구체적으로는 MQ에서 메세지를 주기적으로 가져와야 하는 상황이었는데, 내부에서 사용

seriouskang.tistory.com

 

쓰레드 및 관련 설정 내용

 

스프링 부트에서 Schedule 사용하기

시작하며 특정 시간에 주기적으로 해야 하는 일이 있습니다. 뉴스레터와 같은 이메일 발송, 주기적으로 데이터베이스 동기화, 이용시간이 적은 시간에 대량 로그 전송 등등의 일이 그 예시가 될

covenant.tistory.com

 

크론 관련 내용

 

[Spring Boot] @Scheduled를 이용한 스케쥴러 구현하기

Spring Boot`에서 @Scheduled 어노테이션을 이용하여 스케쥴러를 구현하는 방법에 대해 작성하였습니다

velog.io

 

크론 관련 예시

 

스프링부트 스케줄 설정 법 & Cron 주기설정

스프링 스케줄 설정 법 @SpringBootApplication @EnableScheduling public class Scheduler { @Scheduled(cron = "10 * * * * *") public void run() { // TODO System.out.println("현재 시간은 " + new Date()); } } Colored by Color Scripter cs 클래스

itworldyo.tistory.com