본문 바로가기

개발/NestJS

[NestJS]NestJS 에서 서비스 상태체크 하기(HealthCheck)

상태 확인은 애플리케이션의 상태와 성능을 모니터링하는 데 도움이 되며 애플리케이션의 안정성과 가용성을 보장하는 데 중요한 부분입니다.
NestJS는 확장 가능하고 효율적인 웹 애플리케이션을 구축하기 위한 강력한 프레임워크이며 상태 확인을 처리하기 위한 내장 모듈 HealthCheck를 제공합니다.
NestJS에서 애플리케이션의 상태체크하는 방법에 대해 알아보도록 하겠습니다.

○ @nestjs/terminus 패키지 설치

NestJS에서 상태 확인을 처리하기 위한 공식 라이브러리인 @nestjs/terminus 패키지를 설치해야 합니다.
npm을 사용하여 설치할 수 있습니다.

npm install @nestjs/terminus

○애플리케이션 루트 모듈에서 HealthCheckModule를 가져옵니다.

app.module.ts파일에 다음 줄을 추가하여 이 작업을 수행할 수 있습니다.

import { HealthCheckModule } from '@nestjs/terminus';

@Module({
  imports: [HealthCheckModule],
  ...
})
export class AppModule {}

○HealthIndicator 인터페이스를 사용해 헬스체크 서비스를 만들어 줍니다.

HealthCheckModule을 가져왔으므로 이제 애플리케이션에 상태 확인을 추가할 수 있습니다.
데이터베이스의 connection 유무를 확인하는 예제입니다.
예제에서는 true만 반환하도록 했습니다.

import { Injectable, HttpException, HttpStatus } from '@nestjs/common';
import { HealthIndicator, HealthCheck, HealthCheckResult } from '@nestjs/terminus';

@Injectable()
export class DatabaseHealthIndicator implements HealthIndicator {
  async isHealthy(check: HealthCheck): Promise<HealthCheckResult> {
    const result = await this.checkDatabaseConnection();
    if (!result) {
      throw new HttpException('Database connection failed', HttpStatus.SERVICE_UNAVAILABLE);
    }
    return check.getStatus('database', result);
  }

  private async checkDatabaseConnection(): Promise<boolean> {
    // Your database connection check logic here
    return true;
  }
}

DatabaseHealthIndicator클래스는 HealthIndicator인터페이스를 구현하고 데이터베이스의 connection을 확인하는 단일 상태 검사를 제공합니다.
check.getStatus메서드는 상태 확인 결과를 반환하는 데 사용됩니다.
데이터베이스 연결이 실패하면 HttpException적절한 상태 코드와 함께 exception이 발생합니다.

○ health check 컨트롤러

헬스체크 컨트롤러를 만들고 아래와 같이 이전에 만들어 둔 헬스체크 서비스를 가져와 사용합니다.

import { Controller, Get } from '@nestjs/common';
import { HealthCheck, HealthCheckService } from '@nestjs/terminus';

@Controller('health')
export class HealthController {
  constructor(private health: HealthCheckService) {}

  @Get()
  @HealthCheck()
  check() {
    return this.health.check([
      async () => this.database.isHealthy()
    ]);
  }
}

HealthController클래스는 @Controller데코레이터로 만들어지며 애플리케이션의 상태를 확인하기 위한 단일 엔드포인트를 생성합니다.
@Get() 데코레이터는 api endpoint를 만듭니다. /health.
@HealthCheck() 데코레이터는 엔드포인트에 액세스 할 때 상태 확인을 트리거하는 데 사용됩니다.

상태 확인 컨트롤러는 HealthCheckService를 사용하여 실제 상태 확인을 수행합니다.
메서드를 호출하고 상태 확인 함수 배열을 check메서드에 HealthCheckService전달합니다.
isHealthy이 경우 서비스에서 메서드를 호출하여 DatabaseHealthIndicator데이터베이스 연결 상태 검사를 수행합니다.

○ database health check 프로바이더 등록

마지막으로 애플리케이션에 상태 확인 서비스를 등록해야 합니다.
app.module.ts파일에 다음 줄을 추가하여 이 작업을 수행할 수 있습니다.

@Module({
  providers: [DatabaseHealthIndicator],
  ...
})
export class AppModule {}

○ health 응답

데이터베이스 연결이 정상이면 응답은 다음과 같을 수 있습니다.

{
  "status": "UP",
  "checks": [
    {
      "name": "Database",
      "status": "UP"
    }
  ]
}

status는 UP 또는 DOWN를 나타내는 속성이 있습니다.
checks속성은 각 개별 구성 요소의 상태를 나타내는 개체의 배열입니다.
이 경우 검사 중인 구성 요소(데이터베이스)가 하나만 있고 해당 상태는 UP입니다.
구성 요소가 정상이 아닌 경우 해당 구성 요소의 상태는 DOWN이고 응답은 애플리케이션의 전체 상태도 DOWN임을 나타냅니다.


상태 확인은 애플리케이션의 안정성과 가용성을 보장하는 데 중요한 부분입니다.
NestJS의 HealthCheck 모듈은 애플리케이션에 상태 검사를 할 수 있는 방법을 제공하고 있습니다.
HealthCheck 모듈을 사용하지 않고 간단히 api 엔드포인트를 만들어 서버의 정상동작유무만 확인하는 헬스체크 api를 만들어 사용할 수도 있습니다.

'개발 > NestJS' 카테고리의 다른 글

[NestJS] NestJS provider - 종속성 주입이란  (0) 2023.02.11
[NestJS] NestJS 설치 및 로컬 서버 실행  (2) 2022.11.13