개요
- 특정 시간에 주기적으로 해야 하는 일이 있다. 예를 들어, 구독하고 있는 구독자들에게 뉴스레터와 같은 이메일 발송, 주기적으로 데이터베이스 동기화, 이용시간이 적은 시간에 대량 로그 전송 등의 일이다.
- 비드마켓 애플리케이션 상에서도 주기적으로 해야 하는 일이 있다.
경매 기간 자동 종료 → 낙찰자 선정
Spring Scheduler
- SpringBoot에서는 위와 같은 작업을
@Schedule
어노테이션을 사용하면 쉽게 할 수 있다.
- 스프링 스케줄러를 우리의 프로젝트에 적용하면 다음과 같은 흐름으로 동작한다.
- 스케줄러가 1분에 한 번씩 돌면서 경매 리스트를 조회를 한다.
- 일치하는 경매가 있다면 상태 완료로 처리하고 경매 종료시 수행해야할 로직들을 수행한다.
경매가 현재 진행중인지, 종료 시간이 현재 시간과 일치하는 경매 리스트를 조회한다. (연도 월 일 시 분까지)
스케줄링 작업이 1분마다 동작해도 문제가 없는 이유는 웬만하면 조회의 결과가 없기 때문이다.
매 분마다 경매 리스트 조회 쿼리가 다 날라가고 일치하는지 확인하는데, 조회 쿼리가 분 단위로 넘어가지 않을 것이다.
우려되는 점
- 기본적으로 스프링 스케줄러 작업을 한다면, 스프링은 스케줄링을 위해서 스레드가 하나만 있는 스레드 풀을 만든다.
그러면
@Scheduled
작업은 대기열에 쌓이게 되며 단일 스레드에 의해서만 실행됩니다.스케줄링에 의해 관리되는 작업이 여러 개 있을 때, 여러 작업을 제시간에 맞추어서 실행하기 위해서는 스레드를 늘릴 필요가 있다.
⇒
SchedulingConfigurer
인터페이스를 구현하여 설정을 변경할 수 있다.