우노
[Kotlin] @Scheduled 란? 본문
들어가기 앞서,
- Spring의 @Scheduled 작업은 기본적으로 싱글 스레드에서 실행됩니다.
- 두 개 이상의 @Scheduled 작업이 정의되어 있어도, 병렬 스케줄링 설정을 하지 않으면 스프링의 기본 설정으로 인해 동시에 실행되지 않고 순차적으로 실행됩니다.
- 해당 개념을 모르고 무작정 코드부터 짰다가 병렬 쓰레드로 동작하지 않아, 원인을 찾느라 시간을 많이 썼습니다.. ㅜㅜ
@Scheduled 란?
- @Scheduled는 Spring 프레임워크에서 제공하는 스케줄링 작업을 정의하는 어노테이션입니다.
- 특정 메서드를 주기적으로 실행하거나 예약된 시간에 실행할 수 있도록 설정하는 데 사용됩니다.
- Spring Scheduling 기능을 활성화하면, @Scheduled 어노테이션이 붙은 메서드가 자동으로 실행됩니다.
주요 기능
- 주기적으로 실행해야 하는 작업 (배치 작업, 데이터 처리 등)에 사용.
- 간단하게 설정으로 크론 표현식, 고정된 간격(fixedRate), 고정된 지연(fixedDelay) 등을 지원.
사용 방법
스케줄링 활성화
@Scheduled를 사용하려면 Spring Boot 또는 Spring 프로젝트에서 스케줄링 기능을 활성화해야 합니다.
@SpringBootApplication @EnableScheduling // 스케줄링 활성화 public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
@Scheduled 어노테이션 적용
@Scheduled 어노테이션을 메서드에 붙여 스케줄링 작업을 정의합니다.
@Scheduled 어노테이션 적용 방법
(1) 고정된 간격으로 실행 (fixedRate)
이전 작업이 시작된 시간 기준으로 일정 간격으로 실행.
@Component public class ScheduledTasks { @Scheduled(fixedRate = 5000) // 5초 간격으로 실행 public void fixedRateTask() { System.out.println("Fixed Rate Task: " + System.currentTimeMillis()); } }
(2) 작업이 끝난 후 일정 시간 뒤 실행 (fixedDelay)
이전 작업이 종료된 시점 기준으로 일정 간격 뒤 실행.
@Scheduled(fixedDelay = 5000) // 이전 작업 종료 후 5초 뒤 실행 public void fixedDelayTask() { System.out.println("Fixed Delay Task: " + System.currentTimeMillis()); }
(3) 초기 지연 시간 설정 (initialDelay)
작업이 시작되기 전에 초기 대기 시간을 설정.
@Scheduled(fixedRate = 5000, initialDelay = 2000) // 2초 대기 후 시작, 5초 간격 실행 public void initialDelayTask() { System.out.println("Initial Delay Task: " + System.currentTimeMillis()); }
(4) 크론 표현식 (cron)
크론 표현식을 사용해 원하는 시간대나 요일에 작업 실행.
@Scheduled(cron = "0 0 12 * * ?") // 매일 12시에 실행 public void cronTask() { System.out.println("Cron Task: " + System.currentTimeMillis()); }
크론 표현식 구조
초(0-59) 분(0-59) 시(0-23) 일(1-31) 월(1-12) 요일(0-7)
표현식 설명 0 * * * * ?
매 분 0초마다 실행 0 0 12 * * ?
매일 정오(12:00)에 실행 0 0 0 * * 1
매주 월요일 자정에 실행 */10 * * * * ?
매 10초마다 실행
주의사항
- 빈으로 등록된 메서드만 실행
- @Scheduled가 적용된 메서드는 반드시 Spring 빈으로 등록된 클래스에 있어야 합니다.
- 리턴 타입은 void
- @Scheduled 메서드는 리턴 값을 가질 수 없습니다.
- 병렬 실행 주의
- 기본적으로 단일 스레드에서 실행되므로, 두 개 이상의 @Scheduled 작업이 정의되어 있어도, 병렬 스케줄링 설정을 하지 않으면 스프링의 기본 설정으로 인해 동시에 실행되지 않고 순차적으로 실행됩니다.
- 병렬 처리가 필요하면 TaskScheduler 또는 @Async를 함께 사용해야 합니다.
병렬 스케줄링 설정
스케줄러가 단일 스레드로 동작하는 기본 동작을 변경하려면, 커스텀 TaskScheduler를 설정할 수 있습니다.
@Configuration public class SchedulerConfig { @Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setPoolSize(5); // 5개의 스레드 풀 scheduler.setThreadNamePrefix("MyScheduler-"); return scheduler; } }
'Web_App > Kotlin' 카테고리의 다른 글
[Kotlin] Controller와 Service의 계층 구조 (0) | 2024.12.20 |
---|---|
[Kotlin] @SqlResultSetMapping (0) | 2024.12.20 |
[Kotlin] ORM, JPA, Spring Data JPA (1) | 2024.12.18 |
[Kotlin] @Entity와 @Repository (0) | 2024.12.18 |
[Kotlin] DTO와 Entity의 관계 (0) | 2024.12.17 |
Comments