오늘의 키워드
- Spring Scheduler
오늘의 내용
Spring Scheduler는 일정한 시간 간격이나 특정 시간에 코드를 실행할 수 있도록 하는 기능으로 @Scheduled 어노테이션을 사용하여 작업을 예약할 수 있고 Spring Scheduler를 설정하고 사용하는 방법은 다음과 같다
- Application 클래스에 @EnableScheduling 추가:
@EnableScheduling
@SpringBootApplication
public class SchedulerApplication {
public static void main(String[] args) {
SpringApplication.run(SchedulerApplication.class, args);
}
}
- 스케줄링 작업을 위해 ScheduleConfig 작성:
@Configuration
@EnableScheduling
public class ScheduleConfig {
@Scheduled(fixedDelay = 1000) // 1초마다 실행
public void run() {
System.out.println("Hello World");
}
}
- 스프링 빈에 등록된 클래스만 가능하다
- Scheduled의 속성들
- fixedDelay : milliseconds 단위로, 이전 Task의 종료 시점으로부터 정의된 시간만큼 지난 후 Task를 실행한다
@Scheduled(fixedDelay = 1000) - fixedDelayString : fixedDelay와 같은데 문자열로 값을 표현한다
@Scheduled(fixedDelay = "1000") - fixedRate : milliseconds 단위로 이전 Task의 시작 시점으로부터 정의된 시간만큼 지난 후 Task를 실행한다
- fixedRateString : fixedRate와 같은데 문자열로 값을 표현한다
- fixedRate는 작업 수행시간과 상관없이 일정 주기마다 메서드를 호출하는 것이고
fixedDelay는 (작업 수행 시간을 포함하여) 작업을 마친 후부터 주기 타이머가 돌아 메서드를 호출하는 것이다 - initialDelay : 스케줄러에서 메소드가 등록되자마자 수행하는 것이 아닌 초기 지연시간을 설정하는 것이다
@Scheduled(fixedRate = 5000, initialDelay = 3000) - initialDelayString : 위와 마찬가지로 문자열로 값을 표현하겠다는 의미이다
- cron : Cron 표현식을 사용해 작업을 예약한다
@Scheduled(cron = "* * * * * *")
* : 모든 조건(매시, 매일, 매주처럼 사용)을 의미
? : 설정 값 없음 (날짜와 요일에서만 사용 가능)
- : 범위를 지정할 때
, : 여러 값을 지정할 때
/ : 증분값, 즉 초기값과 증가치 설정에 사용
L : 마지막 - 지정할 수 있는 범위의 마지막 값 설정 시 사용 (날짜와 요일에서만 사용 가능)
W : 가장 가까운 평일(weekday)을 설정할 때 - zone : cron 표현식을 사용했을 때 time zone을 따로 설정하지 않으면 기본적으로 Local의 time zone이다
@Scheduled(cron = "* * * * * *", zone = "Asia/Seoul")
- fixedDelay : milliseconds 단위로, 이전 Task의 종료 시점으로부터 정의된 시간만큼 지난 후 Task를 실행한다
- 동적 스케줄링 : 애플리케이션 실행 중에 스케줄을 동적으로 변경할 수 있고 Spring에서 제공하는 TaskScheduler를 사용해 런타임에 스케줄을 변경할 수 있다
@Configuration
public class DynamicSchedulerConfig {
@Bean
public TaskScheduler taskScheduler() {
return new ThreadPoolTaskScheduler();
}
}
@Service
public class DynamicSchedulerService {
@Autowired
private TaskScheduler taskScheduler;
private ScheduledFuture<?> futureTask;
public void scheduleTask(Runnable task, String cronExpression) {
if (futureTask != null) {
futureTask.cancel(true);
}
futureTask = taskScheduler.schedule(task, new CronTrigger(cronExpression));
}
}
오늘의 회고
최종 프로젝트 기능을 구현하면서 매일매일 도전을 하는 기능을 구현하다가 spring batch와 schedule 중 고민을 했는데 내가 작업하는 기능은 대용량 데이터를 처리하는 게 아니다 보니 schedule을 사용하기로 했고 그에 대해 공부를 해보았다
'TIL' 카테고리의 다른 글
TIL내일배움캠프 try-with-resources (0) | 2024.07.29 |
---|---|
TIL내일배움캠프 15주차 Spring Boot로 REST API와 AOP를 활용한 코드 실행 및 로그 기록 (0) | 2024.07.22 |
TIL내일배움캠프 14주차 최종프로젝트 실시간 채팅 (0) | 2024.07.19 |
TIL내일배움캠프 14주차 KPT 회고 (0) | 2024.07.16 |
TIL내일배움캠프 13주차 Spring Boot와 React 통합 (0) | 2024.07.13 |