Nest는 의존성 주입(DI) 기반의 프레임워크이다.
Spring처럼 클래스 중심 구조인데, 각 클래스는 Nest가 자동으로 생성하고 관리한다.
개발을 하다보니 아래와 같은 궁금증이 들었다.
내 서비스 클래스는 언제 만들어지고, 언제 사라지는 거지?
앱을 처음 시작하거나 종료할 때 내가 하고 싶은 작업이 있다면 그 타이밍을 정확히 알아야 했다.
그걸 도와주는 게 바로 Nest의 LifeCycle Hook이다.
Nest 앱이 돌아가는 기본 흐름은 다음과 같다.
main.ts 실행
↓
AppModule 로딩
↓
각 Module/Provider 의존성 주입
↓
컨트롤러/서비스 작동
↓
요청 처리 완료
이 안에서 개발자가 개입할 수 있는 순간들에 Hook이 동작한다.
Hook은 중간에 끼어드는 지점이다.
Nest에서 특정 이벤트(앱 초기화, 종료 등)가 발생하면, 내가 작성한 메서드를 자동으로 호출해준다.
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가 잘 처리해줌.
위 코드를 실행해보면,
NestJS 애플리케이션이 시작되었을 때:
MyService 초기화!
→ onModuleInit()이 호출됨
NestJS 애플리케이션이 종료될 때
앱 종료 감지! 시그널: SIGINT
→ onApplicationShutdown(signal: string)이 호출됨
onModuleDestroy()는 특정 모듈의 종료 시점에 호출됨
onApplicationShutdown()은 전체 애플리케이션이 종료될 때 호출됨
[onModuleDestroy] → [onApplicationShutdown]
→ 둘 다 필요한 이유는 범위가 다르기 때문이다.
예를 들어, 모듈별로 리소스를 정리할 게 있다면 onModuleDestroy,
전역적으로 정리할 게 있다면 onApplicationShutdown를 사용하면 된다.
..등과 같은 상황에서 사용할 수 있따