방탈출 예약 프로젝트를 하다보니 다음과 같은 의문이 들었다.
예약을 할 슬롯은 관리자가 손수 만드는 게 아니라 자동으로 자정에 생겨야하는데?
자정 같은 정해진 시간이나 1시간 단위 등 반복적으로 api 호출을 할 수 있는 방법이 뭐가 있을까 하여 열심히 방법을 찾아보게 되었다.
NestJS에서는 주기적으로 코드를 동작해주는 SchedeuleModule를 제공한다.
NestJS의 Task Scheduling 공식 페이지에 잘 설명되어있다.
먼저 스케쥴 모듈과 타입 구분을 위해 라이브러리를 설치한다.
$ yarn add @nestjs/schedule
$ yarn add @types/cron
사용할 모듈의 import란에 ScheduleModule.forRoot()를 추가하면 해당 모듈에서 스케쥴러를 사용할 수 있다.

등록한 후에는 @Cron 데코레이터를 사용해 원하는 코드를 작성한다.

@Cron 데코레이터 안에는 어느 주기로 이 함수를 실행할지 정할 수 있다.

혹은 다음과 같이 인자로 문자열을 줄 수도 있다.

이제 Cron으로 스케줄링을 적용한 함수를 살펴보자.

DB에서 5개의 테마를 찾는다.
Date 객체에 넣을 날짜를 위해 일주일 뒤의 날짜를 구한다.
테마의 timetable 배열을 순회하며 시와 분을 구한 뒤, setHours를 통해 시간을 설정한다.
그렇게 startTime을 지정한 slot들을 저장한다.

잘 생성된 모습이다.(본 게시글 작성시에는 10초로 테스트하여 createdAt이 자정이 아님)
깃허브 주소입니다.
https://github.com/labyrinth30/SecretForest-Backend.git