특정 시간마다 자동으로 수행하는 로직은
어떻게 구현해야 할까?
환경
--
- IntelliJ community 2023.1.5
- Spring Boot 3.2.1
- JDK 17
--
스케줄러란?
--
예시로
쇼핑몰에서 회원 등급을 올해 총 구매 금액을 기준으로 부여한다면
매년 회원의 총 구매 금액을 0으로 초기화를 해주어야 한다.
이렇게 특정 시간마다 자동으로 어떠한 로직이 수행되도록 도와주는 것이 스케줄러이다.
Spring에서는 스케줄링을 구현하기 위해
- TaskScheduler : 스케줄링 기능을 관리하는 인터페이스 / 스케줄링할 작업을 정의 및 실행 가능
- @Scheduled : 메서드에 정의할 수 있으며 정의된 메서드는 주기적으로 실행되도록 스케줄링이 된다.
기능을 제공한다.
--
Spring에서 스케줄러 기능 활성화 하기
--
Spring에서 스케줄러 기능을 사용하려면 해당 기능을 활성화 해줘야 한다.
main 메서드가 있는 클래스에 @EnableScheduling 어노테이션을 작성하면 활성화가 된다.
@EnableScheduling
@SpringBootApplication
public class ShopApplication {
public static void main(String[] args) {
SpringApplication.run(ShopApplication.class, args);
}
}
--
@Scheduled 속성
--
@Scheduled는 여러 속성들을 이용하여 스케줄러를 정의할 수 있다.
속성 | 설명 |
fixedRate | 일정한 간격으로 작업(로직)을 실행한다. [ ms 단위 ] |
fixedDelay | 이전 작업의 완료 시점으로 부터 일정한 시간이 지난 후에 작업을 실행한다. [ ms 단위 ] |
initialDelay | 스케줄링을 시작하기 전에 대기해야 하는 초기 지연 시간을 설정한다. [ ms 단위 ] |
cron | 크론 표현식을 이용하여 더 유연한 스케줄링을 정의한다. |
zone | 크론 표현식에서 사용할 시간대를 지정한다. |
cron 표현식
총 6개의 필드로 구성되어 있으며
각 초, 분, 시, 일, 월, 요일을 의미한다.
필드 | 작성 가능 값 |
초 | 0 ~ 59 |
분 | 0 ~ 59 |
시 | 0 ~ 23 |
일 | 1 ~ 31 |
월 | 1 ~ 12 또는 JAN ~ DEC |
요일 | 0 ~ 6 또는 SUN ~ SAT |
그 외에 작성할 수 있는 특수 기호
특수 기호 | 설명 | 사용 가능한 필드 |
* | 모든 값을 의미 | 초, 분, 시, 일, 월, 요일 |
? | 값이 없음을 의미 | 일, 요일 |
- | 범위를 표현할 때 사용 | 초, 분, 시, 일, 월, 요일 |
, | 여러 개의 값을 표현할 때 사용 | 초, 분, 시, 일, 월, 요일 |
/ | 특정 값을 기준으로 값이 증가 할 때마다를 의미 | 초, 분, 시, 일, 월, 요일 |
L | 허용 가능한 값 중에서 마지막 값을 의미 | 일, 요일 |
# | 몇 번째 주의 어떤 요일을 표현할 때 사용 | 요일 |
예시
@Scheduled(fixedRate = 5000)
5초마다 해당 메서드(작업) 실행
@Scheduled(fixedDelay = 5000)
이전 작업이 종료되고 5초 뒤에 해당 메서드(작업) 실행
@Scheduled(initialDelay = 1000)
1초 뒤에 해당 메서드(작업) 실행 시작 (스케줄러 시작)
@Scheduled(cron = "0 0 0 1 1 ?")
매년 1월 1일에 메서드(작업) 실행
@Scheduled(cron = "0 0 0 1 1 ?", zone = "America/New_York")
뉴욕 시간을 기준으로 매년 1월 1일에 메서드(작업) 실행
cron 예시
- 0/10 * * * * ?
매 10초 마다 - 0 0 12 * * ?
매일 낮 12시 마다 - 0 0 0 1 1 ?
매년 1월 1일 마다 - 0 0 11 ? * 5#1
매월 첫 째주 목요일 오전 11시 마다 - 0 0 10 ? * MON-FRI
평일 주중 오전 10시 마다 - 0 0 8,15 ? 4 ?
4월에 매일 8시와 15시 마다 - 0 0 10 L * ?
매월 말일 10시 마다
--
매년 1월 1일에 자동으로 동작하는 로직 작성하기
--
MemberScheduler.java
@Component
@RequiredArgsConstructor
public class MemberScheduler {
private final MemberRepository memberRepository;
@Scheduled(cron = "0 0 0 1 1 ?")
@Transactional
public void updateMemberTotalPay(){
List<Member> memberList = memberRepository.findThisYearPayMember();
for (Member member : memberList){
member.resetThisYearPay();
}
}
}
@Scheduled를 사용하려면 해당 클래스가 @Bean (스프링 빈)에 등록되어 있어야 하므로
MemberScheduler 클래스를 @Component로 정의하여 빈에 등록한다.
스케줄러를 등록할 메서드에 @Scheduled를 정의한다.
--
'Spring Boot' 카테고리의 다른 글
이메일 발송하기 (Google SMTP Server/ Gmail을 통해 발송하기) (0) | 2024.06.01 |
---|---|
spring security에서 발생하는 예외 처리하기 (0) | 2024.05.27 |
validation을 이용하여 유효성 검사하기 [ feat. 회원가입 ] (0) | 2024.04.26 |
전역으로 예외 처리 통일 시키는 방법 (0) | 2024.04.24 |
결제 API 포트원 (구 아임포트)로 결제 시스템 구현하기 (0) | 2024.04.23 |