개념 정리/Spring

[Spring] @Scheduled 이용해 특정 시간마다 함수 호출하기

쇼티드 2023. 7. 24. 02:26
728x90
반응형

@Scheduled 란?

Spring에서는 @Scheduled 어노테이션을 이용해 특정 시각에 혹은 일정 시간 간격마다 함수를 호출할 수 있다.


사용법

@EnableScheduling
@SpringBootApplication
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }

}

먼저 @EnableScheduling 어노테이션을 Application 클래스에 추가한다.

 

@Service
public class TestService {
 
    //매일 아침 8시 실행
    @Scheduled(cron = "0 0 8 * * *")
    public void testSchedule() {
			System.out.println("아침 8시에 실행!");
    }  
}

다음으로 @Service를 사용해 스프링 빈에 추가된 클래스에 있는

함수의 위에 @Scheduled 어노테이션을 추가하고 괄호 안에 속성을 넣어준다.

 

물론 @Service가 아니더라도 @Component나 @Configuration과 @Bean을 이용하는 등

스프링 빈에 추가되어만 있으면 된다.

 

주의할 점은 파라미터가 있으면 안된다.

 


속성 설정하는 법

1. fixedRate : 이전 작업이 시작한 시간에서 설정한 시간이 지난 뒤에 함수를 호출한다.

    @Scheduled(fixedRate = 1000)
    public void test() {
        System.out.println("이전 작업 시작 후 1초 마다 실행");
    }

 

2. fixedDelay : 이전 작업이 종료된 시간에서 설정한 시간이 지난 뒤에 함수를 호출한다.

    @Scheduled(fixedDelay = 1000)
    public void test() {
        System.out.println("이전 작업 종료 후 1초 마다 실행");
    }

3. initialDelay : initialDelay 만큼 지연된 후 실행한다.

    @Scheduled(fixedRate = 2000, initialDelay = 1000)
    public void test() {
        System.out.println("이전 작업 시작 후 1초가 지연되고 2초 마다 실행");
    }

    @Scheduled(fixedDelay = 2000, initialDelay = 1000)
    public void test2() {
        System.out.println("이전 작업 종료 후 1초가 지연되고 2초 마다 실행");
    }

 

4. cron : cron 표현식을 통해 속성을 설정할 수 있다.

    @Scheduled(cron = "* * * * * *")
    public void test() {
        System.out.println("cron 방식으로 실행");
    }

총 6개의 *을 볼 수 있다.

순서대로 초, 분, 시간, 일, 월 , 요일 을 나타낸다.

 

  • * : 모두 허용 (매초, 매분, 매일, 매주, 매월)
  • ? : 설정 값 없음
  • - : 범위 설정
  • , : 여러 값을 설정
  • / : 증가하는 값 설정 (초에서 0/10이라면 0초 부터 10초 씩 증가)
  • L : 마지막 (날짜와 요일에서만 사용가능하며 날짜일 경우 마지막 날짜, 요일일 경우 마지막 요일)
  • W : 가장 가까운 평일

예시

    @Scheduled(cron = "0 0 18 * * *")
    public void test() {
        System.out.println("매일 오후 18시에 실행");
    }
    
    @Scheduled(cron = "0 0 12 15,30 * ?")
    public void test() {
        System.out.println("매달 15일,30일 12시에 실행(요일을 비워야 15, 30에만 실행)");
    }
    
    @Scheduled(cron = "0 0 0/1 * * *")
    public void test() {
        System.out.println("1시간 마다 실행");
    }
    
    @Scheduled(cron = "0 0/10 6-12 * * *")
    public void test() {
        System.out.println("매일 6시 부터 12시 까지 10분 마다 실행");
    }
    
    @Scheduled(cron = "0 30 17 1 * *")
    public void test() {
        System.out.println("매달 1일 17시 30분에 실행");
    }

다른 많은 방식들이 있지만 아직 사용해보지 않아 좀 더 공부가 필요할 것 같다.

728x90
반응형