Node.js 내 Health Check 설정 방법

이번에는 Node.js에서 Health Check 시스템을 어떻게 설정하는지에 대해서 살펴보겠습니다. 요즘은 대부분이 Node.js를 쓰고 있는만큼 프로젝트 관리를 위한 Health Check 시스템을 미리 잘 설정하는 것이 안정성 확보를 위해 무척 중요한데요. 이게 생각보다 신경써야 할 부분이 많습니다.

요구 사항

Health Check는 정말 중요합니다. 소프트웨어의 상태 검사는 애플리케이션의 비효율성을 식별하여 더 잘 유지 관리하는 데 도움이 됩니다. 의사가 우리에게 문제가 있는지 확인하는 것과 마찬가지로, 예를 들어 서버 또는 응답 시간에 주의를 기울이는 것과 동일한 원칙이 소프트웨어에 적용됩니다.

먼저 기본 Node.js 상태 확인을 구현합니다. 가장 먼저 확인해야 할 사항은 다음과 같습니다.

  • 컴퓨터에 설치된 Node.js (노드 패키지 관리자와 함께 제공됨)
  • 통합 개발 환경 (IDE)

Health Check가 필요한 이유

Node.js에서 상태 확인을 구현하는 방법에 대해 알아보기 전에 그 중요성과 이러한 확인을 수행하는 습관을 가져야 하는 이유에 대해 이야기해 보겠습니다.

먼저 소프트웨어 또는 기능의 가용성이 매우 중요하다는 사실을 인정해야 합니다. 예를 들어 API 가용성에 대한 일상적인 상태 확인은 중요한 문제를 파악하고 가능한 한 빨리 문제를 해결하는 데 도움이 됩니다.

가동 중지 시간이 발생하면 응용 프로그램 소유자에게 즉시 알릴 수 있으므로 신속하게 해결할 수 있습니다.

소프트웨어 인프라가 성장함에 따라 상태 확인이 더욱 중요해지며 모든 마이크로서비스와 엔드포인트가 완벽하게 작동하는지 확인해야 하는 필요성이 우리가 관리하는 앱에 더욱 중요해집니다.

프로그래밍 언어 또는 스택에서 소프트웨어의 상태를 고려할 때 확인하는 몇 가지 사항이 있는데요. 가장 먼저 챙겨야 하는 건 요청이 있을 때 서버의 응답 시간과 서버가 데이터베이스에 연결하는 방법입니다. 상태 확인이 필요한 또 다른 이유는 서비스 가용성을 유지하기 위해서입니다.

Node.js 내 Health Check 구현

이제 Node.js에서 기본 상태 확인을 구현하는 방법을 살펴보겠습니다. 먼저 git clone을 사용하여 리포지토리를 자신의 컴퓨터에 복제합니다.

git clone https://github.com/bigpreshy/mvc

그리고 npm install을 통해 해당 모듈을 설치하고 실행합니다.

npm install
npm run develop

상태 확인 경로 추가

점검(서버 상태 및 실행 시간 등)을 수행하는 기본 상태 점검을 추가하려면 route 폴더에 healthchecker.js를 추가하고 다음 코드를 추가하면 됩니다.

//js
const express = require("express");
const router = express.Router({});
router.get('/', async (_req, res, _next) => {

    const healthcheck = {
        uptime: process.uptime(),
        message: 'OK',
        timestamp: Date.now()
    };
    try {
        res.send(healthcheck);
    } catch (error) {
        healthcheck.message = error;
        res.status(503).send();
    }
});
// export router with all routes included
module.exports = router;

여기에서 수행한 작업은 다른 경로를 추가하는 것입니다. 이 경로에는 각각 값이 process.uptime(), OK 및 Date.now()인 세 가지 속성(가동 시간, 메시지 및 타임스탬프)이 있는 상태 확인 객체가 있습니다.

또한 try 블록의 코드를 실행하는 try catch도 있습니다. 예외가 있으면 오류(healthcheck 개체의 메시지 값이 오류가 됨)로 응답하고 상태 503을 보냅니다. 마지막으로 모듈을 내보내야 하므로 파일 끝에 ‘module.exports = router;’를 추가합니다.

헬스체크 경로 등록

먼저 경로를 만든 후 index.js 파일을 편집해야합니다. 다음 코드 줄을 추가하기만 하면 됩니다.

app.use('/healthcheck', require('./routes/healthchecker'));

그리고 나면 아래와 같은 index.js 파일 확인이 가능합니다.

const express = require("express");
const app = express();
const mongoose = require("mongoose");
const dotenv = require("dotenv");
const session = require('express-session');
dotenv.config();
const passport = require("passport");
const { loginCheck } = require("./auth/passport");
loginCheck(passport);
// Mongo DB conncetion
const database = process.env.MONGOLAB_URI;
mongoose
  .connect(database, { useUnifiedTopology: true, useNewUrlParser: true })
  .then(() => console.log("e don connect"))
  .catch((err) => console.log(err));
app.set("view engine", "ejs");
//BodyParsing
app.use(express.urlencoded({ extended: false }));
app.use(session({
    secret:'oneboy',
    saveUninitialized: true,
    resave: true
  }));

app.use(passport.initialize());
app.use(passport.session());
//Routes
app.use("/", require("./routes/login"));
app.use('/healthcheck', require('./routes/healthchecker'));

const PORT = process.env.PORT || 4111;
app.listen(PORT, console.log("Server has started at port " + PORT));

여기에는 가동 시간(서버가 시작된 이후 가동되어 실행된 시간), 모든 것이 양호함을 나타내는 “OK” 메시지, 타임스탬프도 포함됩니다.

응답 시간 추가

확인해야 할 또 다른 사항은 응답 시간, 즉 서버가 요청에 응답하는 데 걸리는 시간입니다. 이를 위해서는 route 폴더에 있는 healthchecker.js 파일인 healthcheck 개체의 processtime 속성 값으로 다음 process.hrtime() 메서드를 추가하면 됩니다.

대안

애플리케이션의 상태를 정기적으로 확인하는 수년에 걸쳐 구축된 서비스가 있다는 점도 주목할 가치가 있습니다 (이는 Node.js뿐만 아니라 다른 스택의 애플리케이션도 마찬가지입니다). 일반적으로 https://uptimerobot.com/ 를 가장 많이 사용하지요.

경우에 따라서는 Logrocket이나 Freshping, Uptime, Logicmonitor를 사용하는 것도 방법입니다. 

결론

여기까지 상태 확인에 수반되는 사항과 쉽고 빠른 문제 해결을 위해 애플리케이션에서 이를 고려해야 하는 이유에 대해 설명 드렸습니다.

또한 샘플 프로젝트를 통해 Node.js에서 상태 확인을 구현하는 방법을 살펴보았는데요. 이러한 프로젝트들은 보통 Mongo DB를 데이터베이스로 사용하여 사용자 등록 및 로그인을 처리하는 단순한 Model-view-controller Node.js 기반 프로젝트입니다.

개발할 때는 결국 서버의 응답 시간, 서버의 가동 시간, 서버의 상태 코드(200이면 “OK” 메시지를 받게 됨), 서버의 타임스탬프 등 애플리케이션의 상태에 대해 생각해야 합니다. 이를 통해 서버 안에서 무슨 일이 일어나고 있는지 면밀히 모니터링할 수 있고, 예기치 않은 일이 발생했을 때 어디를 봐야 하는지 알 수 있습니다.

error: Content is protected !!