[Nest.js] 라이프 사이클 LifeCycle

혜원·2025년 5월 23일
3
post-thumbnail

왜 LifeCycle을 알아야 할까?

Nest는 의존성 주입(DI) 기반의 프레임워크이다.
Spring처럼 클래스 중심 구조인데, 각 클래스는 Nest가 자동으로 생성하고 관리한다.

개발을 하다보니 아래와 같은 궁금증이 들었다.


내 서비스 클래스는 언제 만들어지고, 언제 사라지는 거지?

앱을 처음 시작하거나 종료할 때 내가 하고 싶은 작업이 있다면 그 타이밍을 정확히 알아야 했다.
그걸 도와주는 게 바로 Nest의 LifeCycle Hook이다.


기본 실행 흐름

Nest 앱이 돌아가는 기본 흐름은 다음과 같다.

main.ts 실행
    ↓
AppModule 로딩
    ↓
각 Module/Provider 의존성 주입
    ↓
컨트롤러/서비스 작동
    ↓
요청 처리 완료

이 안에서 개발자가 개입할 수 있는 순간들에 Hook이 동작한다.

Hook은 중간에 끼어드는 지점이다.
Nest에서 특정 이벤트(앱 초기화, 종료 등)가 발생하면, 내가 작성한 메서드를 자동으로 호출해준다.


LifeCycle Hook

Nest에서는 네 가지 주요한 hook interface를 제공한다.

Hook언제?무엇을?
OnModuleInit모듈 의존성 주입 직후초기화 로직
OnApplicationBootstrap앱 전체 부트스트랩 이후전역 설정
OnModuleDestroy모듈 종료 직전정리 작업
OnApplicationShutdown앱 종료 시그널 감지 시커넥션 종료 등

이 인터페이스들은 Nest가 알아서 감지해서 호출해주고,
개발자는 클래스에 implements만 붙이면 된다.


import {
  Injectable,
  OnModuleInit,
  OnApplicationShutdown,
} from '@nestjs/common';

@Injectable()
export class MyService implements OnModuleInit, OnApplicationShutdown {
  onModuleInit() {
    console.log('MyService 초기화!');
  }

  onApplicationShutdown(signal: string) {
    console.log(`앱 종료 감지! 시그널: ${signal}`);
  }
}

hook 메서드에 async 붙여도 Nest가 잘 처리해줌.

위 코드를 실행해보면,

  1. NestJS 애플리케이션이 시작되었을 때:

    MyService 초기화!

    onModuleInit()이 호출됨

  2. NestJS 애플리케이션이 종료될 때

    앱 종료 감지! 시그널: SIGINT

    onApplicationShutdown(signal: string)이 호출됨


onModuleDestroy와 onApplicationShutdown의 차이점

onModuleDestroy()는 특정 모듈의 종료 시점에 호출됨
onApplicationShutdown()은 전체 애플리케이션이 종료될 때 호출됨

[onModuleDestroy] → [onApplicationShutdown]

→ 둘 다 필요한 이유는 범위가 다르기 때문이다.

예를 들어, 모듈별로 리소스를 정리할 게 있다면 onModuleDestroy,
전역적으로 정리할 게 있다면 onApplicationShutdown를 사용하면 된다.


어디에 사용할 수 있을까?

  • 앱 시작 시 DB 초기화 or 테스트 데이터 로딩
  • 앱 종료 전에 Redis나 RabbitMQ 커넥션 정리
  • 서버 시작 시 배치 잡 등록
  • 에러 로깅 시스템 초기화

..등과 같은 상황에서 사용할 수 있따


참고 문서

0개의 댓글