밤빵's 개발일지
[TIL]20240815 스프링 스케줄러 본문
스프링 스케줄러(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 |