오늘의 인기 글
최근 글
최근 댓글
Today
Total
12-30 13:56
관리 메뉴

우노

[Kotlin] @Scheduled 란? 본문

Web_App/Kotlin

[Kotlin] @Scheduled 란?

운호(Noah) 2024. 12. 2. 16:18

들어가기 앞서,

  • Spring의 @Scheduled 작업은 기본적으로 싱글 스레드에서 실행됩니다.
  • 두 개 이상의 @Scheduled 작업이 정의되어 있어도, 병렬 스케줄링 설정을 하지 않으면 스프링의 기본 설정으로 인해 동시에 실행되지 않고 순차적으로 실행됩니다.
  • 해당 개념을 모르고 무작정 코드부터 짰다가 병렬 쓰레드로 동작하지 않아, 원인을 찾느라 시간을 많이 썼습니다.. ㅜㅜ

@Scheduled 란?

  • @Scheduled는 Spring 프레임워크에서 제공하는 스케줄링 작업을 정의하는 어노테이션입니다.
  • 특정 메서드를 주기적으로 실행하거나 예약된 시간에 실행할 수 있도록 설정하는 데 사용됩니다.
  • Spring Scheduling 기능을 활성화하면, @Scheduled 어노테이션이 붙은 메서드가 자동으로 실행됩니다.

주요 기능

  • 주기적으로 실행해야 하는 작업 (배치 작업, 데이터 처리 등)에 사용.
  • 간단하게 설정으로 크론 표현식, 고정된 간격(fixedRate), 고정된 지연(fixedDelay) 등을 지원.

사용 방법

    1. 스케줄링 활성화

      @Scheduled를 사용하려면 Spring Boot 또는 Spring 프로젝트에서 스케줄링 기능을 활성화해야 합니다.

      @SpringBootApplication
      @EnableScheduling // 스케줄링 활성화
      public class MyApplication {
         public static void main(String[] args) {
             SpringApplication.run(MyApplication.class, args);
         }
      }
    1. @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