Nest.js를 배워보자/8. NestJS에서 Cron, Scheduler 구현하기

NestJS 스케줄러: @nestjs/schedule 소개

_Blue_Sky_ 2025. 12. 2. 21:00
728x90

 


1. 💡 @nestjs/schedule 모듈의 역할

@nestjs/schedule 모듈은 NestJS 애플리케이션 내에서 정기적인 백그라운드 작업(Scheduled Jobs)을 쉽게 구현할 수 있도록 지원하는 모듈입니다. 이 모듈은 내부적으로 Node.js의 node-cronsetTimeout/setInterval 기능을 활용하여, 서버를 재시작할 필요 없이 정해진 시간에 특정 비즈니스 로직이 자동으로 실행되도록 합니다.

주요 특징

  1. 데코레이터 기반: @Cron(), @Interval(), @Timeout()과 같은 데코레이터를 사용하여 메서드에 실행 시점을 지정합니다.
  2. DI 통합: 스케줄링 로직을 서비스(Provider) 클래스 내부에 정의할 수 있어, 데이터베이스 접근, API 호출 등 다른 DI된 서비스와의 상호작용이 용이합니다.
  3. 간편한 설정: 복잡한 외부 크론(Cron) 서비스나 메시지 큐 없이도 간단한 정기 작업을 구현할 수 있습니다.
728x90

2. 🛠️ 모듈 설치 및 설정

2.1. 설치

스케줄 모듈을 사용하려면 먼저 라이브러리를 설치해야 합니다.

npm install @nestjs/schedule

2.2. 모듈 등록

애플리케이션의 루트 모듈(AppModule) 또는 특정 기능 모듈에 ScheduleModule을 등록합니다.

// src/app.module.ts
import { Module } from '@nestjs/common';
import { ScheduleModule } from '@nestjs/schedule';

@Module({
  imports: [
    // 💡 ScheduleModule을 등록하여 스케줄러 기능을 활성화합니다.
    ScheduleModule.forRoot(),
    // ...
  ],
  // ...
})
export class AppModule {}
728x90

3. 🎯 핵심 데코레이터 소개

@nestjs/schedule은 세 가지 주요 데코레이터를 통해 실행 시점을 정의합니다. 이 데코레이터들은 Provider 클래스의 메서드에 적용되어야 합니다.

데코레이터 역할 설명
@Cron(cronTime) 특정 시각 또는 간격 리눅스에서 사용되는 Cron 표현식을 사용하여 복잡하고 정교한 실행 시점을 지정합니다.
@Interval(milliseconds) 반복 간격 지정된 시간(밀리초, ms)마다 반복하여 메서드를 실행합니다.
@Timeout(milliseconds) 단일 지연 실행 애플리케이션 시작 후 지정된 시간(밀리초, ms)이 지난 뒤 단 한 번 메서드를 실행합니다.

예시 (다음 주제에서 실습할 내용): 

// tasks.service.ts
import { Injectable, Logger } from '@nestjs/common';
import { Cron, Interval } from '@nestjs/schedule';

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

  // 💡 매일 오전 2시 30분 0초에 실행
  @Cron('0 30 2 * * *') 
  handleCron() {
    this.logger.log('정기 DB 백업 시작!');
    // ... DB 백업 로직 ...
  }
  
  // 💡 5초(5000ms)마다 반복 실행
  @Interval(5000)
  handleInterval() {
    this.logger.log('5초마다 캐시 업데이트 시도');
    // ... 캐시 업데이트 로직 ...
  }
}

728x90