본문 바로가기
코딩일기/날씨앱 만들기 프로젝트

[Spring Boot] Scheduler 설명 및 사용법

by 욱파이어니어 2021. 12. 13.
728x90
반응형

Scheduler란?

Scheduler는 특정시간에 주기적으로 작업을 실행하고 싶을때 주로 사용한다.

나같은 경우는 매일 밤 11시에 날씨 API를 호출해야해서 Scheduled를 사용하였다.

 

 

그럼 이제 사용법부터 알아보자.

 

사용법을 아래와 같다.

 

1. Main클래스에 @EnabledScheduling annotation을 입력을 한다.

2. 주기적으로 실행할 작업에 @Scheduled annotation을 사용한다.

 

 

그럼이제 각각의 순서에 대해서 알아보자.

 

 

 

1. Main클래스에 @EnabledScheduling annotation을 입력을 한다.

이건 말 그대로 Main함수가 있는 Main 클래스에 @EnabledScheduling annotation을 적어준다.

 

@EnableScheduling
@SpringBootApplication(scanBasePackages= {"com.wook.controller","com.wook.model","com.wook.service"})
public class Application {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SpringApplication.run(Application.class, args);
	}

}

 

 

 

 

2. 주기적으로 실행할 작업에 @Scheduled annotation을 사용한다.

주기적으로 실행할 작업에 @Schduled annotation을 아래와 같이 적어주면 된다.

 

	@Scheduled(cron="0 5 23 * * *", zone = "Asia/Seoul")
	public void callAPi() throws InterruptedException {

        swrList = new ArrayList<>();
        
        //DB에 저장된 GeoInfo 정보를 ShortWeatherReq List에 추가한다.
        for(GeoInfo gi : gs.getGeoXY()) {
        	swr = new ShortWeatherReq(APK.getApiKey(),gi.getX(),gi.getY());
        	swr.setBaseDate(); //현재 날짜로 baseDate를 설정하는 메소드를 호출
        	swr.setNx(gi.getX()); //x좌표값 저장
        	swr.setNy(gi.getY()); //y좌표값 저장
        	
        	swrList.add(swr); //list에 swr 추가
        }
        
        //위 객체를 가지고 이제 API를 호출할수 있게 Service에게 전해줘야 함
        sws.setSwrList(swrList);
        
        temperList = sws.callSW(); // API 통신 Service 호출
        
        logger.info("-------------------");
        
        logger.info("API ConnectionSuccess");
        
        logger.info("-------------------");
        
        //List에 담긴 온도 DB에 저장
        for(int i = 0;i<temperList.size();i++) {
        	Temperature temp = temperList.get(i);
        	ts.saveTemp(temp);
        }
        
        logger.info("DB Store Success");
	}

 

@Schduled annotation 괄호 안에 cron을 적었는데 cron이 뭐냐면 주기적으로 실행할 특정 시간을 결정 짓는것이다.

 

"초 분 시 일 월 요일" 이렇게 정해주면 된다.

 

나같은 경우는 23시 15분에 한번 호출을 원하니 

"0 15 23 * * *"로 적어주었다.

 

그러면 날짜에 관계없이 무조건 23시 15분에 해당 메소드가 호출이 되는것이다.

그리고 zone 이라는것을 적어주었는데. zone은 날짜나 시간을 어떤걸 기준으로 하는것이냐를 입력하는것이다.

나는 당연히 서울이니까 zone = "Asia/Seoul"로 설정을 해주었다.

 

timezone에 대해서 자세히 알고싶으면 아래 링크를 통해서 알아보면 된다.

 

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과 zone 말고도 다른 속성들이 존재하는데 그 속성들은 아래와 같다. 

 

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

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

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

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

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

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

반응형