[스프링부트] 스케쥴러 사용하기(@Scheduled)

minji·2023년 1월 10일

스프링부트에서는 스케쥴러(Scheduler) 기능을 제공하는데, 주기적으로 특정 기능을 수행해야할 때 사용할 수 있다.

나의 경우, 아래의 두 가지 주기적인 동작이 필요했다.
"매달 1일" 회원의 레벨을 결정
"매일" 특정 조건에 부합하는 회원에게 알림 발송

🕖 스케쥴러 사용하기

클래스 생성

스케쥴러를 관리할 클래스를 생성한다.
간단하게 아래의 3가지 어노테이션을 붙여주면 초기 세팅은 끝난다!

  • @Component
    스케쥴러 클래스는 스프링 빈에 등록된 클래스여야 한다. 따라서 @Component 어노테이션을 붙여준다.

  • @EnablingScheduling
    스케쥴러가 동작하도록 해주는 어노테이션이다. 위처럼 스케쥴러 위에 붙여도 되고, main이 위치한 Application 클래스 위에 붙여주어도 된다.

  • @RequiredArgsConstructor
    final 로 선언된 필드들의 생성자를 만들어준다. 의존성 주입 대신에 사용된다.


스케쥴러 등록(@Scheduled) 및 주기 설정

이제 앞서 말한 두가지
"매달 1일" 회원의 레벨을 결정
"매일" 특정 조건에 부합하는 회원에게 알림 발송

에 대한 스케쥴러를 등록해준다.

이때 사용하는 것이 @Scheduled 어노테이션인데, 주기적으로 실행될 메서드들을 생성하고
그 위에 @Scheduled 어노테이션을 붙여주면 된다.

cron 값의 의미

위에서 볼 수 있듯 @Scheduled의 옵션으로 cron 값을 지정해주어야하는데, 매월, 매일OO시, 매주 등등 스케쥴러가 실행될 시점, 즉 주기를 적어주면 된다.

cron 값은 큰 따옴표 내에 적어주면 되는데, 그 순서대로 "초 분 시 일 월 요일" 을 의미한다.
* 를 적을 경우 모든 조건을 의미한다.

  • Scheduled(cron = "0 0 0 1 * *")
    매달 1일 0시 0분 0초에 동작

  • Scheduled(cron = "0 0 0 * * *")
    매일 0시 0분 0초에 동작


마무리

이렇게 간단하게 몇 개의 어노테이션만으로 주기적으로 동작하는 스케쥴러 구현이 가능하다.

나의 경우, 기능에 대한 구체적인 구현은 해당 서비스 내에 작성하였는데, 구현 함수의 위치는 관점에 따라 달라질 수 있을 것 같다.

종속된 서비스 클래스 내에 함수를 두는것과, 스케쥴 기능이니 스케쥴러 클래스 내에 함수를 두는 것 중 본인에게 더 맞는 방식을 선택하면 좋을 것 같다.

profile
SW Engineer

0개의 댓글