Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240815 스프링 스케줄러 본문

개발Article

[TIL]20240815 스프링 스케줄러

최밤빵 2024. 8. 15. 21:50

스프링 스케줄러(Spring Scheduler)는 백엔드 애플리케이션에서 중요한 작업들을 특정 시간에 자동으로 실행되도록 스케줄링하는 데 사용된다. 예를 들어, 이메일 발송, 데이터베이스 백업, 통계 데이터 갱신, 정산 작업 등 정기적인 작업을 스케줄러를 통해 처리할 수 있다. 

🤓스프링 스케줄러(Spring Scheduler)란?

스프링 스케줄러(Spring Scheduler)는 스프링 프레임워크에서 제공하는 스케줄링 기능으로, 백그라운드 작업을 특정 시간 간격으로 실행할 수 있게 해주는 기능이다. 이는 자바의 java.util.concurrent 패키지의 스케줄링 기능을 바탕으로 하며, 스프링이 이를 더욱 간편하게 사용할 수 있도록 지원한다. 스케줄러는 주로 백그라운드 작업을 처리하거나 주기적으로 실행되어야 하는 작업을 관리하는 데 사용된다.

 

▶ 스프링 스케줄러의 주요 개념

스프링 스케줄러는 크게 세 가지의 기본적인 스케줄링 기능을 제공한다.

 

→ Fixed Rate (고정 비율):

이전 작업이 시작된 시점으로부터 일정 시간 간격마다 작업이 실행된다. 만약 작업이 5초마다 실행되도록 설정했다면, 작업이 완료되지 않았더라도 매 5초마다 작업이 실행된다.

→ Fixed Delay (고정 지연):

이전 작업이 완료된 시점으로부터 일정 시간 간격마다 작업이 실행된다. 예를 들어, 작업이 5초마다 실행되도록 설정했지만, 첫 번째 작업이 3초가 걸렸다면 다음 작업은 8초 후에 시작된다.

→ Cron 표현식 (Cron Expression):

Unix의 Cron 표현식을 사용하여 복잡한 스케줄을 정의할 수 있다. 예를 들어, 매일 자정에 작업을 실행하거나, 매달 1일에만 작업을 실행하도록 설정할 수 있다.

 

▶ 스프링 스케줄러 사용 방법

스프링 스케줄러를 사용하려면 기본적으로 스프링 애플리케이션에 @EnableScheduling 애너테이션을 추가하고, 스케줄러가 실행될 메서드에 @Scheduled 어노테이션을 붙여주면 된다. 다음은 각 방법을 사용한 간단한 코드 예시!

 

▷ @EnableScheduling 설정

스케줄러를 사용하려면 @EnableScheduling 어노테이션을 사용하여 스케줄러 기능을 활성화해야 한다. 보통 스프링 부트 애플리케이션의 메인 클래스나 설정 클래스에 추가한다.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling // 스케줄링 기능 활성화
public class SchedulerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SchedulerApplication.class, args);
    }
}

 

▷ @Scheduled 애너테이션을 사용한 작업 스케줄링

스프링에서는 @Scheduled 어노테이션을 사용하여 간단하게 스케줄러를 정의할 수 있다. 다양한 속성을 설정하여 작업의 실행 간격을 정의할 수 있다.

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class SimpleScheduler {

    // 5초마다 작업을 실행하는 스케줄러 설정
    @Scheduled(fixedRate = 5000) // 고정 비율로 5초마다 실행
    public void runTaskAtFixedRate() {
        System.out.println("고정 비율로 작업 실행: " + System.currentTimeMillis());
    }

    // 이전 작업이 끝난 후 5초 뒤에 작업을 실행하는 스케줄러 설정
    @Scheduled(fixedDelay = 5000) // 고정 지연으로 5초마다 실행
    public void runTaskAtFixedDelay() {
        System.out.println("고정 지연으로 작업 실행: " + System.currentTimeMillis());
    }

    // 매일 자정에 작업을 실행하는 크론 표현식
    @Scheduled(cron = "0 0 0 * * *") // 매일 자정에 실행
    public void runTaskAtMidnight() {
        System.out.println("매일 자정에 작업 실행");
    }
}

→ @Scheduled(fixedRate = 5000): 메서드가 5초마다 고정된 비율로 실행된다.

@Scheduled(fixedDelay = 5000): 이전 메서드가 완료된 후 5초 뒤에 메서드가 실행된다.

@Scheduled(cron = "0 0 0 * * *"): 크론 표현식을 사용하여 매일 자정에 작업을 실행한다.

 

▶스프링 스케줄러 사용 시 주의사항

스프링 스케줄러를 사용할 때는 몇 가지 주의사항을 고려해야 한다:

 

→ 싱글 스레드 모델:

기본적으로 스프링 스케줄러는 단일 스레드로 동작한다. 따라서 여러 작업을 동시에 실행하려면 @Scheduled 어노테이션의 설정 외에도 추가적인 설정을 통해 멀티스레딩을 구성해야 한다.

→ 스케줄러 충돌 문제:

다수의 스케줄러가 동시에 실행될 경우 충돌이 발생할 수 있다. 따라서 스케줄러의 실행 간격을 적절히 조정해야 한다.

→ 트랜잭션 관리:

스케줄러가 데이터베이스 작업을 수행할 경우, 트랜잭션 관리에 주의해야 한다. 특히, 스케줄러가 비정상 종료될 경우 트랜잭션 롤백이나 데이터 불일치 문제가 발생할 수 있다.

→ 분산 환경에서의 동작:

분산 환경(예: 클라우드, 마이크로서비스)에서 동일한 작업이 여러 번 실행되지 않도록 주의해야 한다. 이를 해결하기 위해 분산 락이나 스케줄링 전용 서버를 사용하는 것이 좋다.

 

▶스프링 스케줄러의 장점과 단점

 

▷장점:

→ 간편함:

@Scheduled 애너테이션만으로 간단히 작업을 스케줄링할 수 있어 설정이 매우 쉽다.

→ 유연성:

fixedRate, fixedDelay, cron 등 다양한 옵션을 제공하여 다양한 스케줄링 요구를 충족시킬 수 있다.

  강력한 통합:

스프링의 다른 기능들과 쉽게 통합되어 강력한 백엔드 작업을 수행할 수 있다.

 

▷단점:

  기본 싱글 스레드:

기본적으로 단일 스레드로 동작하기 때문에, 다중 작업을 효율적으로 처리하려면 추가 설정이 필요하다.

  분산 환경 고려 부족:

스프링 스케줄러는 기본적으로 단일 인스턴스 환경을 가정하고 설계되었기 때문에, 분산 환경에서는 추가적인 고려가 필요하다.

 

▶ 스프링 스케줄러의 활용 사례

스프링 스케줄러는 다양한 분야에서 사용될 수 있다. 예를 들어:

 

→ 정기적인 데이터 백업:

데이터베이스의 데이터를 주기적으로 백업하여 데이터 손실을 방지하는 작업.

→ 이메일 발송:

특정 이벤트나 알림을 주기적으로 사용자에게 발송하는 작업.

→ 정산 작업:

일정 주기로 결제나 정산 데이터를 처리하여 결제 누락을 방지하는 작업.

 

▶마무리

스프링 스케줄러는 백엔드 작업을 자동화하고 관리하는 데 매우 유용한 도구로, 이를 적절히 활용하면 애플리케이션의 성능과 유지보수성을 크게 향상시킬 수 있다. 스케줄러를 처음 접한 나는 스케줄러의 다양한 사용 방법과 설정을 이해하는 데 어려움이 있었지만, 다양한 예제와 자료를 통해 공부하면서 조금씩 그 개념을 잡아 나가려고 노력하는 중이다...! 분명 나는 공부를 하고있는데 시간이 지날수록 더 어려운 느낌일까😵‍💫

'개발Article' 카테고리의 다른 글

[TIL]20240817 다대다(Many-to-Many) 연관관계  (0) 2024.08.17
[TIL]20240816 제이미터와 N+1문제  (0) 2024.08.16
[TIL]20240814 N+1 문제해결  (0) 2024.08.14
[TIL]20240813 Nginx  (0) 2024.08.13
[TIL]20240812 성능최적화  (0) 2024.08.12