상태 확인은 애플리케이션의 상태와 성능을 모니터링하는 데 도움이 되며 애플리케이션의 안정성과 가용성을 보장하는 데 중요한 부분입니다.
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 |