ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Nestjs Lifecycle 과 Event hooks
    Node 2024. 11. 19. 22:52

    1. 라이프사이클

    NestJS는 애플리케이션 시작과 종료 시 다양한 이벤트를 발생시킨다. 이를 통해 초기화 작업, 리소스 설정, 클린업(종료 작업) 등을 수행할 수 있다.

    전체 수명 주기를 초기화, 실행 및 종료의 세 단계로 나눌 수 있다.

    nestjs 공식 문서에 나와있는 라이프사이클 이벤트 설명

    2. 라이프사이클 이벤트

    NestJS 의 Lifecycle Events 는 애플리케이션 또는 특정 구성 요소(module, provider, controller)의 수명 주기 동안 특정 시점에 실행되는 메서드이다.

     

    명시적으로 각 훅의 인터페이스를 implements 해야 훅이 정상적으로 트리거된다.

     

     

    2.1. 애플리케이션 초기화 관련 이벤트

    이벤트 대상 설명
    OnModuleInit 모듈, 프로바이더 모듈이나 프로바이더가 생성되고 의존성이 주입된 후 호출된다.
    OnApplicationBootstrap 애플리케이션, 프로바이더 애플리케이션의 모든 초기화가 완료된 후 호출한다.

     

    예제: OnModuleInit

    import { Injectable, OnModuleInit } from '@nestjs/common';
    
    @Injectable()
    export class AppService implements OnModuleInit {
      onModuleInit() {
        console.log('Module has been initialized');
      }
    }

     

    예제: OnApplicationBootstrap

    import { Injectable, OnApplicationBootstrap } from '@nestjs/common';
    
    @Injectable()
    export class AppService implements OnApplicationBootstrap {
      onApplicationBootstrap() {
        console.log('Application has been bootstrapped');
      }
    }

     

    2.2 애플리케이션 종료 관련 이벤트

    이벤트 대상 설명
    OnModuleDestory 모듈, 프로바이더 모듈이 종료되기 전에 호출된다.
    BeforeApplicationShutdown 애플리케이션, 프로바이더 애플리케이션 종료 전 호출된다.
    OnAppliationShutdown 애플리케이션, 프로바이더 애플리케이션 종료 후 호출된다.

     

    종료 훅(hook) 리스너는 시스템 리소스를 소모하므로 기본적으로 비활성화된다.

     

    위 테이블의 종료 관련 훅(OnModuleDestory, BeforeApplicationShutdown, OnApplicationShutdown)은 명시적으로 app.close() 를 호출하거나 특수 시스템 신호(예: SIGTERM) 를 수신하고 애플리케이션 부트스트랩에서 enableShutdownHooks 를 올바르게 호출한 경우에 트리거된다.

     

    종료 훅(hook) 리스너 활성화 예시

    import { NestFactory } from '@nestjs/core';
    import { AppModule } from './app.module';
    
    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
    
      // Starts listening for shutdown hooks
      app.enableShutdownHooks();
    
      await app.listen(process.env.PORT ?? 3000);
    }
    bootstrap();
Designed by Tistory.