@Scheduled

설명

Spring Boot 에서 @Scheduled 어노테이션을 사용하면 일정한 시간 간격으로, 혹은 특정 시간에 코드가 실행되도록 설정할 수 있습니다.

주기적으로 실행해야 하는 작업이 있을 대 적용해 쉽게 사용할 수 있습니다.

사용법

@Scheduled 어노테이션을 사용하기 위해 다음과 같이 Application Class 에서 @EnableScheduling 을 추가해야 합니다.

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

 

그리고 실제 스케줄링 작업할 클래스를 만드시면 됩니다.

@Service
public class SchedulerService {     

    @Scheduled(fixedDelay = 1000) // 1초마다 실행    
    public void run() {        
    	System.out.println("Hello CoCo World!);    
    }
}

 

여기서 중요한 부분은 스프링 빈에 등록된 클래스여야 합니다.

 

이렇게 두 개의 어노테이션을 적기만 하면 설정은 끝이고 다음 규칙을 지키며 스케줄러 메소드를 만드시면 됩니다.

@Scheduled 규칙 - Method 는 void 타입으로, 매개변수 사용이 불가

 

속성

fixedDelay

밀리세컨드 단위로, 이전 Task 의 종료시점으로부터 정의된 시간만큼 지난 후 Task 를 실행합니다.

@Scheduled(fixedDelay = 1000) // "1000" 도 가능합니다.
public void run() {
  System.out.println("Hello Java World!!")
}

 

fixedRate

이전 Task 의 시작 시점으로부터 정의된 시간만큼 지난 후 Task 를 실행합니다.

@Scheduled(fixedRate = 1000)
public void run() {
  System.out.println("Hello Java World!!")
}

 

initialDelay

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

@Scheduled(fixedRate = 1000, initialDelay = 3000)
public void run() {
  System.out.println("Hello Java World!!")
}

 

위와 같이 사용하면 3초의 대기시간후에 5초마다 "Hello Java World!!" 를 출력하는 작업을 스케줄러가 수행해 줍니다.

fixedDelay vs fixedRate

 

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

fixedDelay 는 작업을 마친 후부터 주기 타이머가 돌아 메소드를 호출하는 것입니다.

 

cron

Cron 표현식을 사용하여 작업을 예약할 수 있습니다.

쉽게 말해 월,일,시분초 로 작업을 나눌 수 있습니다.
아쉽게도 연도 설정은 하실 수 없습니다.

표현식

* : 모든 조건(매시, 매일, 매주처럼 사용) 을 의미합니다.

? : 설정값이 없다는 것을 나타냅니다. ( 날짜와 요일에서만 사용이 가능 )

- : 범위를 지정할 때 사용합니다.

, : 여러 값을 지정할 때 사용합니다.

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

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

// 매일 오후 18시에 실행
@Scheduled(cron = "0 0 18 * * *")
public void runDailyAt18() {
    System.out.println("Hello CoCo World!");
}

// 매달 10일, 20일 14시에 실행
@Scheduled(cron = "0 0 14 10,20 * ?")
public void runMonthlyOn10thAnd20thAt14() {
    System.out.println("Hello CoCo World!");
}

// 매달 마지막 날 22시에 실행
@Scheduled(cron = "0 0 22 L * ?")
public void runMonthlyLastDayAt22() {
    System.out.println("Hello CoCo World!");
}

// 1시간마다 실행 (예: 01:00, 02:00, 03:00 ...)
@Scheduled(cron = "0 0 0/1 * * *")
public void runEveryHour() {
    System.out.println("Hello CoCo World!");
}

// 매일 9시 00분 ~ 9시 55분, 18시 00분 ~ 18시 55분 사이에 5분 간격으로 실행
@Scheduled(cron = "0 0/5 9,18 * * *")
public void runEvery5MinutesAt9And18() {
    System.out.println("Hello CoCo World!");
}

// 매일 9시 00분 ~ 18시 55분 사이에 5분 간격으로 실행
@Scheduled(cron = "0 0/5 9-18 * * *")
public void runEvery5MinutesFrom9To18() {
    System.out.println("Hello CoCo World!");
}

// 매달 1일 10시 30분에 실행
@Scheduled(cron = "0 30 10 1 * *")
public void runMonthlyOn1stAt1030() {
    System.out.println("Hello CoCo World!");
}

// 매년 3월 중 월-금 10시 30분에 실행
@Scheduled(cron = "0 30 10 ? 3 1-5")
public void runMarchWeekdaysAt1030() {
    System.out.println("Hello CoCo World!");
}

// 매달 마지막 토요일 10시 30분에 실행
@Scheduled(cron = "0 30 10 ? * 6L")
public void runLastSaturdayAt1030() {
    System.out.println("Hello CoCo World!");
}

 

 

'Spring' 카테고리의 다른 글

스프링의 메세지, 국제화  (0) 2025.02.13
@valid vs @validated  (0) 2025.02.03
@Controller 와 @RestController  (2) 2025.01.22
ResponseEntity  (0) 2025.01.16
JSON 형태로 객체 반환하기  (1) 2025.01.15