# Lifecycle Events

## Lifecycle Events

모든 응용 프로그램 요소에는 Nest에서 관리하는 수명주기가 있습니다. Nest는 **수명 후크**를 제공하여 주요 수명 순간에 대한 가시성과 발생시 행동 할 수있는 기능을 제공합니다.

## Lifecycle sequence

생성자를 호출하여 인젝터블/컨트롤러를 생성한 후 Nest는 특정 순간에 다음 순서로 라이프 사이클 후크 메소드를 호출합니다.

|                          |                                                       |
| ------------------------ | ----------------------------------------------------- |
| `OnModuleInit`           | 호스트 모듈이 초기화되면 호출                                      |
| `OnApplicationBootstrap` | 응용 프로그램이 완전히 시작되고 부트 스트랩되면 호출됩니다.                     |
| `OnModuleDestroy`        | Nest가 호스트 모듈을 파괴하기 직전에 정리 (`app.close()`메소드가 평가되었습니다) |
| `OnApplicationShutdown`  | 시스템 신호에 응답합니다 (예:`SIGTERM`에 의해 응용 프로그램이 종료된 경우)       |

## Usage

각 수명주기 후크는 인터페이스로 표시됩니다. 인터페이스는 TypeScript 컴파일 후에는 존재하지 않기 때문에 기술적으로 선택 사항입니다. 그럼에도 불구하고 강력한 타이핑 및 편집기 툴링의 이점을 얻으려면 사용하는 것이 좋습니다.

```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`로 표시).

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

## OnApplicationShutdown

`OnApplicationShutdown`은 시스템 신호에 응답합니다 (예: `SIGTERM`에 의해 어플리케이션이 종료 될 때). 이 후크를 사용하여 Nest 애플리케이션을 정상적으로 종료하십시오. 이 기능은 종종 [Kubernetes](https://kubernetes.io/), [Heroku](https://www.heroku.com/) 또는 유사한 서비스와 함께 사용됩니다.

이 후크를 사용하려면 종료 신호를 수신하는 리스너를 활성화해야합니다.

```typescript
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 응용 프로그램이 종료되지 않습니다.

```typescript
@@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"
  }
}
```
