컴공생의 다이어리

[NestJS] Task Scheduling 본문

Development/Node.js & JavaScript

[NestJS] Task Scheduling

컴공 K 2023. 2. 5. 00:01

[NestJS] Task Scheduling

NestJS에서 주기적으로 반복적인 작업을 처리하는 Task Scheduling을 위해서는 @nestjs/schedule 패키지를 활용하면 된다. 이 글에서는 Task Scheduling에 대해서 정리해보고자 한다.

 

 

 

제일 먼저 Task Scheduling에 필요한 패키지인 @nestjs/schedule@types/cron를 아래 명령어로 설치해준다.

$ npm install --save @nestjs/schedule
$ npm install --save-dev @types/cron

 

 

scheduler 사용을 위해 @nestjs/schedule 패키지에 포함된 ScheduleModule을 import를 해줘야 한다. 공식문서에는 AppModule에 아래와 같이 불러온다.

import { Module } from '@nestjs/common';
import { ScheduleModule } from '@nestjs/schedule';

@Module({
  imports: [
    ScheduleModule.forRoot()
  ],
})
export class AppModule {}

혹시, 따로 schedule 관련 모듈을 분리해서 관리고자 하면 해당 모듈 파일에 SchduleModule.forRoot()를 import 해주면 된다.

 

참고 : ScheduleModule

ScheduleModule은 forRoot() 메서드를 통해 가져오는데, 이 과정에서 Nest는 스케줄러를 초기화하고 앱에 선언한 크론 잡과 타임아웃, 인터벌을 등록한다.

 

 

 

그리고 Service 단에서 작성한 메소드 위에 @Cron 데코레이터를 달아서 아래와 같이 사용하면 된다. 아래 예시는 handleCron() 메서드를 통해 매분 45초마다 실행된다. 45초가 지나고 실행시키는 것이 아닌 45초, 1분 45초, 2분 45초.. 이런 식으로 45초 지점마다 실행되는 것이다.

import { Injectable, Logger } from '@nestjs/common';
import { Cron } from '@nestjs/schedule';

@Injectable()
export class TasksService {
  private readonly logger = new Logger(TasksService.name);

  @Cron('45 * * * * *') // 매 45초마다 실행됨
  handleCron() {
    this.logger.debug('Called when the current second is 45');
  }
}

 

 

실행 주기 설정은 @Cron 데코레이터 안에 2가지 방식으로 설정해줄 수 있다.

  1. 직접 입력하기
  2. @nestjs/schedule 패키지의 CronExpression 활용

 

 

1. 직접 입력해주기

공백으로 구분된 여섯 개의 값을 가지는 문자열을 입력해주는 패턴이다. 다섯 자리만 표기하면 초를 0으로 취급한다. *뒤에 /(슬래시)를 붙이고 숫자를 넣어주면 숫자에 해당하는 간격마다 실행할 수 있다. 조금 더 자세한 내용은 아래 패턴과 예시를 참고하면 좋을 것 같다.

# example
* * * * * *		# 매 초
45 * * * * *		# 매분 45초
0 10 * * * *		# 매시 10분 시작
0 */30 9-17 * * *	# 오전 9시부터 오후 5시까지 30분 간격으로
0 30 11 * * 1-5		# 월요일~금요일 오전 11시 30분

 

2. @nestjs/schedule 패키지의 CronExpression 활용

@nestjs/schedule 패키지에서 제공하는 CronExpression을 활용하면 아래와 같이 간단하게 주기를 설정해 줄 수 있다. 설정하고자 하는 주기에 대해 찾아보려면 CronExpression 관련 공식문서를 참고하거나 IDE에서 CronExpression을 타고 들어가서 찾아보면 좋을 것 같다.

# example
CronExpression.EVERY_SECOND		# 매초마다(* * * * * *)
CronExpression.EVERY_30_SECONDS		# 30초 간격마다(*/30 * * * * *)
CronExpression.EVERY_HOUR		# 1시간 간격마다(0 0-23/1 * * *)
CronExpression.EVERY_2_HOURS		# 2시간 간격마다(0 0-23/2 * * *)
CronExpression.EVERY_DAY_AT_6AM		# 매일 오전 6시마다(0 06 * * *)

 

CronExpression을 활용하는 것이 개인적으로는 굳이 직접 입력하지 않아도 기본적으로 활용할 수 있고 직관적이기 때문에 내가 진행했던 프로젝트에서는 이 방식을 채택했다.

 

 

 

 

 

 

 

 

https://docs.nestjs.com/techniques/task-scheduling

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac

docs.nestjs.com

 

728x90
Comments