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