NestJS 애플리케이션에 Health Check를 추가하는 방법!

NestJS 애플리케이션 내 Health Check 추가

이번 글에서는 NestJS 애플리케이션 개발 시 Health Check 모듈을 추가하는 방법에 대해 깊이 있는 내용을 다뤄보겠습니다. 건강 점검(Health Check)은 애플리케이션이 정상적으로 작동하고 있는지를 확인하는 중요하고 필수적인 메커니즘입니다. 이를 통해 애플리케이션의 신뢰성과 가용성을 높일 수 있습니다.


상태 확인 엔드포인트의 중요성

상태 확인 엔드포인트는 애플리케이션이 수행되는 방식에 대한 세부 정보를 제공합니다. 상태 확인 기능을 추가하는 이유는 무엇일까요? 우리는 애플리케이션을 빌드하고 배포한 후에도 그 애플리케이션이 원활하게 실행되고 있는지를 확인해야 합니다. 예를 들어, 데이터베이스가 정상적으로 작동하고 있는지, 스토리지 디스크의 수명이 다하지 않았는지, 그리고 애플리케이션 서비스가 의도한 대로 작동하고 있는지를 확인할 수 있습니다.

상태 확인이 필요한 가장 중요한 이유는 애플리케이션을 지속적으로 모니터링할 수 있기 때문입니다. 예를 들어, 우리가 Microservices 아키텍처로 애플리케이션을 구축했다고 가정해 보겠습니다. 이때 각 서비스는 독립적으로 작동하지만, 이를 모니터링하지 않으면 전체 시스템의 신뢰성에 문제가 생길 수 있습니다. 서비스 간의 통신이 원활하지 않거나, 하나의 서비스가 중단되기도 쉬우므로, 모니터링이 필수적입니다.

또한, 소프트웨어 또는 하드웨어 오류가 발생하게 되면, 미리 설정한 경고 시스템을 통해 개발자에게 알려주는 것이 가능해집니다. 예를 들어, AWS CloudWatch, Prometheus와 같은 도구들이 이를 지원합니다. 장애가 발생한 경우엔 수동 또는 자동으로 개입할 수 있는 시스템이 구축되므로, 애플리케이션은 정상 상태로 되돌릴 수 있습니다. 이는 애플리케이션의 신뢰성을 크게 향상시키는 중요한 요소입니다.

상태 확인 기능 설명
서비스 모니터링 애플리케이션의 각 서비스가 정상적으로 작동하는지를 확인
경고 시스템 특정 오류 발생 시 개발자에게 알림
메트릭 수집 성능 수치 및 지표를 모니터링
장애 복구 자동 또는 수동으로 애플리케이션을 정상 상태로 복귀

NestJS에서 상태 확인 방법

NestJS 프레임워크에서 Health Check 기능을 제공하는 @nestjs/terminus 라이브러리를 활용하여 상태 확인을 추가하는 방법을 살펴보겠습니다. 이 라이브러리는 HTTP 애플리케이션에서 Kubernetes의 준비성 및 활성 상태 확인을 통합하는 데 매우 유용합니다. 이 라이브러리를 통해 체계적으로 상태를 점검할 수 있습니다.

먼저, NestJS 애플리케이션에 Terminus 라이브러리를 추가합니다. 커맨드 라인에서 다음 명령어를 입력합니다:

bash
npm install @nestjs/terminus

이 프로그램은 시스템의 각 구성 요소를 검증하기 위한 준비 상태 및 활성 상태 검사 기능을 제공합니다. 활성 상태 검사는 컨테이너가 현재 실행 중인지 여부를 알려주고, 준비 상태 검사는 컨테이너가 외부의 요청을 수락할 준비가 되었는지를 확인합니다.

다음으로 데이터베이스, 메모리, 디스크 및 Redis와 같은 여러 검사 기능을 설정하여 상태 검사가 작동하는 방식을 구체적으로 이해해 보겠습니다. 각 상태 확인 기능은 테스트할 서비스의 성격에 따라 다릅니다. 예를 들어, 데이터베이스의 상태를 점검할 때 사용되는 HttpHealthIndicator, MemoryHealthIndicator, DiskHealthIndicator와 같은 내장 커맨드가 있습니다.

상태 확인 지표 설정하기

우선하여 DiskHealthIndicator부터 시작해 보겠습니다. 이 지표는 서버의 하드 디스크가 어떻게 작동하는지를 확인합니다. 다음과 같이 설정합니다:

typescript
this.disk.checkStorage(diskStorage, { thresholdPercent: 0.5, path: C:\ });

HttpHealthIndicator는 HTTP 애플리케이션의 세부 정보와 실행 여부를 점검합니다. 이를 통해 애플리케이션이 정상적으로 작동하는지를 확인할 수 있습니다:

typescript
this.http.pingCheck(Basic check, http://localhost:3000);

마지막으로, MemoryHealthIndicator는 애플리케이션이 실행 중인 시스템의 메모리 세부 정보를 제공합니다:

typescript
this.memory.checkHeap(memory_heap, 30010241024);
this.memory.checkRSS(memory_rss, 30010241024);

이러한 설정을 통해 우리는 여러 가지 지표를 통해 애플리케이션의 상태를 검사할 수 있습니다. 이 외에도 배포된 애플리케이션의 상태를 모니터링하기 위해 다양한 서드파티 도구와의 연동이 필요합니다.

상태 확인 기능 사용 예시 설명
DiskHealthIndicator checkStorage 디스크 사용률 확인
HttpHealthIndicator pingCheck HTTP 요청 응답 확인
MemoryHealthIndicator checkHeap 메모리 사용량 확인

NestJS 애플리케이션에 Health Check 통합하기

이제 NestJS 애플리케이션 내에 Health Check 기능을 통합하는 구체적인 방법을 살펴보겠습니다. 우선, NestJS CLI를 사용하여 새 애플리케이션을 생성합니다. 아래의 명령어로 healthcheckdemo라는 이름의 애플리케이션을 생성합니다:

bash
nest new healthcheckdemo

이제 Prisma ORM을 사용하기 위해 필요한 패키지를 설치하겠습니다:

bash
npm install prisma –save-dev

이후 Prisma CLI를 설치하고 아래의 명령어로 데이터베이스 모델 스키마를 초기화합니다:

bash
npx prisma init

생성된 schema.prisma 파일에서는 사용자가 가입하여 게시물을 작성할 수 있는 간단한 스키마를 설정하고 있습니다. 예를 들어 MySQL 데이터베이스를 사용하는 경우, 모델 정의는 아래와 같습니다:

prisma
generator client {
provider = prisma-client-js
engineType = binary
}

datasource db {
provider = mysql
url = env(DATABASE_URL)
}

model User {
id Int @default(autoincrement()) @id
email String @unique
name String? posts Post[]
}

model Post {
id Int @default(autoincrement()) @id
title String
content String? published Boolean? @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}

이제 npm run prisma migrate dev 명령어를 통해 데이터베이스에 테이블을 생성할 수 있습니다. 그리고 이를 기반으로 Health Check 관련 모듈을 생성합니다.

Health Module 생성하기

Health Check의 엔드포인트 및 로직에 맞게 HealthModule을 생성해야 합니다. 아래 코드를 참고하여 기본적인 구성 요소를 설정할 수 있습니다:

typescript
import { Module } from @nestjs/common;
import { TerminusModule } from @nestjs/terminus;
import { HealthController } from ./health.controller;
import { PrismaService } from src/prisma.service;

@Module({
imports: [TerminusModule],
controllers: [HealthController],
providers: [PrismaService],
})
export class HealthModule {}

이렇게 생성된 HealthModule을 통해 다양한 Health Indicator와 함께 상태 확인 기능을 구현할 수 있습니다. 예를 들어 데이터베이스에 대한 상태 확인을 위해 PrismaService에 대한 인스턴스를 바탕으로 상태를 체크할 수 있도록 합니다.

이와 같은 방식으로 @nestjs/terminus 라이브러리를 통해 Health Check 기능을 성공적으로 구현할 수 있고, 이를 통해 애플리케이션의 신뢰성과 품질을 높일 수 있습니다.


결론

NestJS 애플리케이션에 Health Check를 추가하는 것은 애플리케이션의 신뢰성 및 가용성을 높이는 중요한 방법입니다. 본 글에서 다룬 것처럼, @nestjs/terminus 라이브러리를 통해 각종 상태 확인을 간편하게 설정할 수 있으며, 이를 통해 개발자는 지속적인 모니터링을 통해 문제를 조기에 발견하고 대응할 수 있는 능력을 강화할 수 있습니다.

이제 여러분도 NestJS 애플리케이션에 Health Check 기능을 추가하여 안정성과 신뢰성을 높여 보세요! 어쩌면 나중에 이 애플리케이션은 항상 건강해!라는 농담을 할 수 있을지도 모릅니다. 새로운 기능을 계속 추가하여 발전해 나가는 것도 잊지 마세요!


자주 묻는 질문과 답변

Q1: NestJS에서 Health Check 기능을 추가하는 단계는 무엇인가요?

답변1: Health Check 기능을 추가하려면 @nestjs/terminus 라이브러리를 설치하고, 다양한 Health Indicator를 설정하여 특정 상태를 점검하는 엔드포인트를 생성합니다.

Q2: Health Check는 왜 중요한가요?

답변2: Health Check는 애플리케이션의 신뢰성을 높이고, 장애 발생 시 조기에 감지할 수 있도록 도와줍니다. 이를 통해 안정적인 서비스를 제공할 수 있습니다.

Q3: 어떤 Health Indicator가 있나요?

답변3: HttpHealthIndicator, DiskHealthIndicator, MemoryHealthIndicator, PrismaOrmHealthIndicator 등 다양한 Health Indicator를 사용할 수 있습니다.

Q4: 상태 점검 후 문제가 발견되면 어떻게 해야 하나요?

답변4: 문제가 발생하면 미리 설정된 알림 시스템을 통해 개발자에게 경고가 전달되고, 수동 또는 자동으로 문제를 해결하는 방안을 강구해야 합니다.

NestJS 애플리케이션에 Health Check를 추가하는 방법!

NestJS 애플리케이션에 Health Check를 추가하는 방법!

NestJS 애플리케이션에 Health Check를 추가하는 방법!