[Spring] Spring scheduler 정리

msw-Hub·2025년 3월 10일

springboot

목록 보기
1/4
post-thumbnail

> 스케쥴링 방식❓

서버가 특정시간에 , 혹은 특정 시간마다 알아서 동작을 하기 위해서는 스케쥴링 방식이 사용된다.
흔히 사용하는 클라이언트의 요청에 응답하는 방식인 REST API 방식과는 다른 방식으로, 클라이언트의 요청 없이도 서버가 자체적으로 동작하는 방식을 의미한다.
웹 애플리케이션 및 서버 시스템에서는 반복적으로 실행해야 하는 작업이 존재한다.
이러한 작업을 수동으로 수행하면 비효율적이며, 실수 발생 가능성이 높다.
데이터 백업, 갱신, 로그 정리, 서버상태 점검 및 리소스 관리 등에 사용된다.

스케쥴링 방식에는 Spring Scheduler 와 Quartz Scheduler 방식이 있다.
Quartz Scheduler는 복합적인 여러가지 스케줄링 기능을 제공하는 오픈소스 라이브러리로, 다양한 트리거, 클러스터링, DB 연동을 지원하므로 복잡한 작업을 효율적으로 관리할 수 있지만, 설정이 복잡하며 코드량이 많기때문에, 간단한 작업을 하는데는 Spring Scheduler가 사용된다.


> Spring scheduler❓

직접 사용하고 기록하는겸 여기서는 Spring scheduler에 관해서 작성하겠다.
Spring Scheduler는 @Scheduled 어노테이션을 이용하여 간단한 반복 작업을 수행할 때 유용하다.
특별한 설정 없이 Spring Boot에서 기본적으로 제공되므로 사용이 간편하다.


1. @EnableScheduling

@SpringBootApplication
@EnableScheduling			<<<<<< 추가
public class BackEndApplication {

	public static void main(String[] args) {
		SpringApplication.run(BackEndApplication.class, args);
	}

}

main클래스에 @EnableScheduling를 명시해준다.


2. @Scheduled / ScheduledTask Class

동작할 ScheduledTask 클래스를 작성한다.
이제 특정 메서드에 @Scheduled를 추가하여 자동 실행할 작업을 정의할 수 있다.
아래의 메서드는 이전에 작성했던 메서드로, 매일 0시 5분마다 게임 아이템의 전날 거래량을 갱신하는 메서드이다.

@Component
public class ScheduledTask {

    @Async
    @Scheduled(cron = "0 5 0 * * ?") // 매일 0시 5분
    public void renewTradeCount() {
        log.info("======================TradeCount Start======================");
        craftService.renewTradeCount();
        log.info("======================TradeCount End========================");
    }
    
}

3. @Scheduled 속성

@Scheduled에는 여러 가지 방식의 실행 주기 설정이 가능하다.

1. fixedRate

@Scheduled(fixedRate = 5000) // 5초마다 실행

이전 작업의 시작 시간 기준으로 일정 간격마다 실행된다.
작업이 끝나지 않았더라도 일정 주기로 실행된다.
✔️ 특징: 실행 시간이 일정함 (설정한 간격마다 실행됨).
❌ 단점: 이전 작업이 끝나지 않아도 새로운 작업이 실행될 수 있음 (부하 발생 가능).

2. fixedDelay

@Scheduled(fixedDelay = 5000) // 이전 작업 종료 후 5초 후 실행

이전 작업이 완료된 후 지정된 시간만큼 기다린 후 실행된다.
✔️ 특징: 이전 작업이 끝난 후 일정 시간 후 실행됨.
❌ 단점: 실행 시간이 일정하지 않을 수 있음.

3. initialDelay

@Scheduled(initialDelay = 10000, fixedRate = 5000) // 앱 시작 후 10초 뒤 실행, 이후 5초마다 실행

✔️ 특징: 서비스가 시작되자마자 실행되지 않고, 일정 시간이 지난 후 시작됨.

4. cron 표현식

@Scheduled(cron = "0 0 3 * * THU") // 매주 목요일 새벽 3시 실행

보다 정밀한 주기 설정이 필요할 때 사용.
Cron 표현식은 초, 분, 시, 일, 월, 요일을 조합하여 특정 시간에 작업을 실행할 수 있도록 한다.
✔️ 특징: 특정 날짜 및 시간 지정 가능.
cron = " * * * * * * " 을 디폴트로, 맨앞필드 부터 아래의 값들을 넣어 지정가능하다.


4. 멀티 스레드 실행 설정

Spring Scheduler는 기본적으로 단일 스레드로 실행된다.
여러 개의 작업이 동시에 실행되도록 하려면 @Async를 사용한 비동기 실행을 해야한다. 메서드 위에 어노테이션을 붙여주면된다.


5. 스케쥴링 오류처리 ( @Retryable 활용 )

만일 메서드가 예상 가능한 범주 내에서 오류가 발생한다면, 이를 어떻게 처리하면 좋을까?
나같은 경우에는 api키를 활용해서 게임사 서버에 데이터를 요청하고 받을때, 간혹 분당 API Request Limit를 넘겨서 오류가 발생하는 경우가 있었다. 이때 해당 오류를 커스텀 에러 핸들러로 만들어, 특정 오류가 발생했을때, 다시 시도하도록 @Retryable를 활용하였다.

@Retryable 속성

  1. retryFor
    retryFor는 재시도할 예외 클래스를 지정한다.
    이 속성에 지정된 예외가 발생했을 때 해당 메서드를 재시도하게 된다.
  2. maxAttempts
    maxAttempts는 메서드를 최대 몇 번 재시도할지 설정하는 속성이다.
    이 값은 기본적으로 3으로 설정되어 있으며, 필요에 따라 변경할 수 있다.
  3. backoff
    backoff는 재시도 간의 대기 시간을 설정한다.
    @Backoff 어노테이션을 사용하여 대기 시간 관련 설정을 추가할 수 있다.

예시

@Retryable(
    retryFor = { RenewTradeCountException.class },  // 특정 예외 발생 시 재시도
    maxAttempts = 5,                               // 최대 5번 재시도
    backoff = @Backoff(delay = 80000)              // 재시도 간에 80초의 대기 시간
)
profile
천천히 시작하는 개발자

0개의 댓글