Spring

[Spring] Spring에서 Scheduler 처리하기

BigBeen 2022. 10. 26. 09:08
반응형

일정한 시간간격 또는 일정한 시각에 특정 로직을 돌리기 위해서 사용하는 것을
'Scheduler' 라고 한다.
Spring에선 'Spring Scheduler' 라이브러리를 제공한다.


 💡 Spring Scheduler

  • Spring Scheduler는 Spring Boot starter에 기본적인 의존성이 제공되기 때문에 별도의 추가적인 의존성이 필요하지 않다.
  • 사용하기 위해서 Application Class에 @EnableScheduling 어노테이션 선언

Application.class

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



그리고 @Scheduled 어노테이션을 지정하는 메서드에 선언한다. @Scheduled Method는 두 가지 규칙을 가지고 있어야 한다.

 -   method는 void의 return Type 가져야 함
 -   method는 파라미터를 가질 수 없음

 


ScheduleTask.class
public class Scheculer() {

    @Scheduled(fixedDelay = 1000) // scheduler 끝나는 시간 기준으로 1초 간격으로 실행
    public void scheduleFixedDelayTask() {
        System.out.println(
                "Fixed delay task - " + System.currentTimeMillis() / 1000);
    }

    @Scheduled(fixedRate = 1000) // scheduler 시작하는 시간 기준으로 1초 간격으로 실행
    public void scheduleFixedRateTask() {
        System.out.println(
                "Fixed rate task - " + System.currentTimeMillis() / 1000);
    }

    
    @Transactional(rollbackFor = Exception.class)
    @Scheduled(cron = "0 1 0 * * *") // 매일 0시 1분 마다 실행
    public void autoDeletePhoneNumSert() {
        log.info("======== PhoneNumCert Manage Task start ========");
        int cnt = taskPhoneNumCertMapper.deleteByCreatedDt();
        log.info(cnt + "개 정보 삭제");
        log.info("======== PhoneNumCert Manage Task completed ========");
    }


 @Scheduled(cron = "0 15 10 15 * ?", zone = "Europe/Paris") // cron에 TimeZone 설정 추가
}

 

❗️ Cron 표현식을 통해 특정 시각에 실행되게끔 할 수 있다.
  • Cron 표현식 : 7개의 각 필드로 구성되어 있으며, 각 필드의 내용은 아래와 같다.

         

 초  | 분   |  시 |  일  |  월  | 요일 | 연도
0~59| 0~59 | 0~23| 1~31| 1~12| 0~6 | 생략가능

요일: 0 (일요일) ~ 6(토요일)
?: 설정 값 없을 때 - 일과 요일에서만 사용 가능
* : 모든 조건
시작시간 / 단위 : 시작시간 부터 해당 단위 때
시작범위-끝범위 : 시작범위 부터 끝 범위까지
L : 마지막-일, 요일에서만 사용 가능
W: 가장 가까운 평일 찾는다 - 일 에서만 사용 가능
ex) 10W

10일이 평일 일 때 : 10일에 실행
10일이 토요일 일 때 : 가장 가까운 평일인 금요일(9일)에 참
10일이 일요일 일 때 : 가장 가까운 평일인 월요일(11일)에 참
# : 몇 주 째인지 찾는다 - 요일 에서만 사용 가능
ex) 3#2 : 수요일 #2째주에 참
 

Properties

 

cron cron표현식을 지원한다. "초 분 시 일 월 요일(년)"으로 표현한다. 
fixedDelay milliseconds 단위로, 이전 작업이 끝난 시점으로 부터 고정된 시간을 설정한다. ex) fixedDelay = 5000
fixedDelayString fixedDelay와 같은데 property의 value만 문자열로 넣는 것이다. ex) fixedDelay = "5000"
fixedRate milliseconds 단위로, 이전 작업이 수행되기 시작한 시점으로 부터 고정된 시간을 설정한다. ex) fixedRate = 3000
fixedRateString fixedDelay와 같은데 property의 value만 문자열로 넣는 것이다. ex) fixedRate = "3000"
initialDelay 스케줄러에서 메서드가 등록되자마자 수행하는 것이 아닌 초기 지연시간을 설정하는 것이다.
initialDelayString 위와 마찬가지로 문자열로 값을 표현하겠다는 의미다.
zone cron표현식을 사용했을 때 사용할 time zone으로 따로 설정하지 않으면 기본적으로 서버의 time zone이다.






출처 : https://jeong-pro.tistory.com/186

         https://sabarada.tistory.com/113

         https://m.blog.naver.com/deeperain/221609802306

반응형