Lifecycle Events

Lifecycle Events

λͺ¨λ“  μ‘μš© ν”„λ‘œκ·Έλž¨ μš”μ†Œμ—λŠ” Nestμ—μ„œ κ΄€λ¦¬ν•˜λŠ” 수λͺ…μ£ΌκΈ°κ°€ μžˆμŠ΅λ‹ˆλ‹€. NestλŠ” 수λͺ… 후크λ₯Ό μ œκ³΅ν•˜μ—¬ μ£Όμš” 수λͺ… μˆœκ°„μ— λŒ€ν•œ κ°€μ‹œμ„±κ³Ό λ°œμƒμ‹œ 행동 ν•  μˆ˜μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

Lifecycle sequence

μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜μ—¬ 인젝터블/컨트둀러λ₯Ό μƒμ„±ν•œ ν›„ NestλŠ” νŠΉμ • μˆœκ°„μ— λ‹€μŒ μˆœμ„œλ‘œ 라이프 사이클 후크 λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

OnModuleInit

호슀트 λͺ¨λ“ˆμ΄ μ΄ˆκΈ°ν™”λ˜λ©΄ 호좜

OnApplicationBootstrap

μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μ™„μ „νžˆ μ‹œμž‘λ˜κ³  λΆ€νŠΈ 슀트랩되면 ν˜ΈμΆœλ©λ‹ˆλ‹€.

OnModuleDestroy

Nestκ°€ 호슀트 λͺ¨λ“ˆμ„ νŒŒκ΄΄ν•˜κΈ° 직전에 정리 (app.close()λ©”μ†Œλ“œκ°€ ν‰κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€)

OnApplicationShutdown

μ‹œμŠ€ν…œ μ‹ ν˜Έμ— μ‘λ‹΅ν•©λ‹ˆλ‹€ (예:SIGTERM에 μ˜ν•΄ μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλœ 경우)

Usage

각 수λͺ…μ£ΌκΈ° ν›„ν¬λŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€. μΈν„°νŽ˜μ΄μŠ€λŠ” TypeScript 컴파일 ν›„μ—λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 기술적으둜 선택 μ‚¬ν•­μž…λ‹ˆλ‹€. κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  κ°•λ ₯ν•œ 타이핑 및 νŽΈμ§‘κΈ° 툴링의 이점을 μ–»μœΌλ €λ©΄ μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

@@filename()
import { Injectable, OnModuleInit } from '@nestjs/common';

@Injectable()
export class UsersService implements OnModuleInit {
  onModuleInit() {
    console.log(`The module has been initialized.`);
  }
}
@@switch
import { Injectable } from '@nestjs/common';

@Injectable()
export class UsersService {
  onModuleInit() {
    console.log(`The module has been initialized.`);
  }
}

λ˜ν•œ OnModuleInit및 OnApplicationBootstrap후크λ₯Ό μ‚¬μš©ν•˜λ©΄ μ‘μš© ν”„λ‘œκ·Έλž¨ μ΄ˆκΈ°ν™” ν”„λ‘œμ„ΈμŠ€λ₯Ό μ—°κΈ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€ ( Promiseλ₯Ό λ°˜ν™˜ν•˜κ±°λ‚˜ λ©”μ†Œλ“œλ₯Ό async둜 ν‘œμ‹œ).

@@filename()
async onModuleInit(): Promise<void> {
  await this.fetch();
}
@@switch
async onModuleInit() {
  await this.fetch();
}

OnApplicationShutdown

OnApplicationShutdown은 μ‹œμŠ€ν…œ μ‹ ν˜Έμ— μ‘λ‹΅ν•©λ‹ˆλ‹€ (예: SIGTERM에 μ˜ν•΄ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ’…λ£Œ 될 λ•Œ). 이 후크λ₯Ό μ‚¬μš©ν•˜μ—¬ Nest μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ •μƒμ μœΌλ‘œ μ’…λ£Œν•˜μ‹­μ‹œμ˜€. 이 κΈ°λŠ₯은 μ’…μ’… Kubernetes, Heroku λ˜λŠ” μœ μ‚¬ν•œ μ„œλΉ„μŠ€μ™€ ν•¨κ»˜ μ‚¬μš©λ©λ‹ˆλ‹€.

이 후크λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ μ’…λ£Œ μ‹ ν˜Έλ₯Ό μˆ˜μ‹ ν•˜λŠ” λ¦¬μŠ€λ„ˆλ₯Ό ν™œμ„±ν™”ν•΄μ•Όν•©λ‹ˆλ‹€.

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  // Starts listening to shutdown hooks
  app.enableShutdownHooks();
  await app.listen(3000);
}
bootstrap();

μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μ‹ ν˜Έλ₯Ό μˆ˜μ‹ ν•˜λ©΄ ν•΄λ‹Ή μ‹ ν˜Έλ₯Ό 첫 번째 맀개 λ³€μˆ˜λ‘œ μ‚¬μš©ν•˜μ—¬ Injectable의 onApplicationShutdownκΈ°λŠ₯을 ν˜ΈμΆœν•©λ‹ˆλ‹€. ν•¨μˆ˜κ°€ 약속을 λ°˜ν™˜ν•˜λ©΄ 약속이 ν•΄κ²°λ˜κ±°λ‚˜ κ±°λΆ€ 될 λ•ŒκΉŒμ§€ Nest μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

@@filename()
@Injectable()
class UsersService implements OnApplicationShutdown {
  onApplicationShutdown(signal: string) {
    console.log(signal); // e.g. "SIGINT"
  }
}
@@switch
@Injectable()
class UsersService implements OnApplicationShutdown {
  onApplicationShutdown(signal) {
    console.log(signal); // e.g. "SIGINT"
  }
}

Last updated

Was this helpful?