상세 컨텐츠

본문 제목

Schedul

Java TIL

by 개발일지작성 2023. 12. 23. 11:52

본문

728x90

1. Schedule란 무엇인가


Spring Framework에서 제공하는 어노테이션 중 하나로, 주기적인 작업을 수행하기 위한 메서드에 적용한다.

이 어노테이션을 사용하면 메서드를 주기적으로 실행 할 수 있다.

 

 

2. 사용 방법


1. 의존성 추가 : 스프링 부트 프로젝트의 경우 spring-boot-starterspring-boot-starter-data-jpa 의존성을 추가하면 스케줄링을 위한 기본 설정이 포함된다.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    // 다른 의존성들...
}


2. @EnableScheduling 어노테이션 사용: @EnableScheduling 어노테이션을 사용하여 스케줄링을 활성화가 된다. 이 어노테이션은 @SpringBootApplication 클래스나 그와 유사한 설정 클래스에 추가된다.

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

 

3. @Scheduled 어노테이션 적용: 주기적으로 실행할 메서드에 @Scheduled 어노테이션을 적용합니다. 이 어노테이션에는 cron 표현식이나 고정된 간격(fixedRate, fixedDelay, initialDelay 등)을 사용하여 스케줄링이 수행됩니다.

 

    @Scheduled(fixedDelay = 1000) // 1초마다 실행, milliseconds 단위로, 이전 Task의 종료 시점으로부터 정의된 시간만큼 지난 후 Task를 실행한다.
    public void run() {
        System.out.println("Hello");
    }

    @Scheduled(fixedDelay = "1000") // fixedDelay 와 같지만 문자열로 값을 표현
    public void run() {
        System.out.println("Hello");
    }

    @Scheduled(fixedRate = 1000) // milliseconds 단위로, 이전 Task의 시작 시점으로부터 정의된 시간만큼 지난 후 Task 실행
    public void run() {
        System.out.println("Hello");
    }

    @Scheduled(fixedRateString = "1000") // fixedRate와 같지만 문자열로 값을 표현
    public void run() {
        System.out.println("Hello");
    }

fixedDelay vs fixedRate

 

fixedRate : 작업 수행시간과 상관없이 일정 주기마다 메소드를 호출하는 것

fixedDelay : (작업수행 시간을 포함하여) 작업을 마친 후부터 주기 타이머가 돌아 메소드를 호출하는 것

initialDelay스케줄러에서 메소드가 등록되자마자 수행하는 것이 아닌 초기 지연시간을 설정하는 것

   @Scheduled(fixedRate = 5000, initialDelay = 3000) // 3초 대기시간 (initialDelay) 후에 5초(fixedRate) 마다 "Hello" 를 출력
    public void run() {
        System.out.println("Hello");
    }

 

 

initialDelayString  : 위와 마차가지로 문자열로 값을 표현하는 것

    @Scheduled(fixedRate = 5000, initialDelayString = "3000")
      public void run() {    
         System.out.println("Hello CoCo World!");
    }

 

2-1 : cron


Cron 표현식을 사용하여 작업을 예약

(6자리 설정만 허용하며 연도 설정은 할 수 없다.)

 

    @Scheduled(cron = "* * * * * *")
    public void run() {
        System.out.println("Hello");
    }

 

첫 번째 * 부터

초 (0-59)

분 (0-59)

시간 (0-23)

일 (1-31)

월 (1-12)

요일 (0-6) (0:일 - 6:토)

 

? : 설정 값 없음 (날짜와 요일에서만 사용 가능)

- : 범위를 지정할 때

, : 여러값을 지정할 때

/ : 증분값, 즉 초기값과 증가치 설정에 사용

L : 마지막 - 지정할 수 있는 범위의 마지막 값 설정 시 사용 (날짜와 요일에서만 사용 가능)

W : 가장 가까운 평일을 설정할 때

예) 10W

- 10일이 평일 일 때 : 10일에 실행

- 10일이 토요일 일때 : 가장 가까운 평일인 금요일(9일)에 실행

- 10일이 일요일 일 때 : 가장 가까운 평일인 월요일(11일)에 실행

 

#: N번째 주 특정 요일을 설정할 때 (-요일에서만 사용 가능)

예) 4#2

- 목요일 #2째주에 실행

 

zone : cron 표현식을 사용했을 때 사용할 time zone 으로 따로 설정하지 않으면 기본적으로 Local의 time zone 이다.

    @Scheduled(cron = "* * * * * *", zone = "Asia/Seoul")
    public void run() {
        System.out.println("Hello");
    }

 

 

관련글 더보기