개발이야기/Node&Nest

Nest.js 에서 cluster로 요청 격리하기

Roslyn 2024. 1. 17. 13:52
반응형

기본적으로 Node.js를 계승한 Nest.js는 Node.js와 마찬가지로 요청이 격리되지 않는 이슈가 있다. (싱글스레드)

다른 Asp.net, Spring, PHP 등보다 안정성이 떨어지는 건 바로 이 부분인데, 요청이 격리되는 다른 웹언어들은 한곳에서 오류가 나도 그 요청에 대한 오류로 끝나지만, Node.js나 Nest.js는 서버 응용프로그램이 종료되는 치명적인 문제를 가지고 있다.

때문에, 반드시 요청을 격리시켜주는 별도의 작업이 필요하게 되는데, 그중 가장 기본적인 방법을 기술해보자.

 

먼저 node 의 cluster를 원활히 사용하기 위해 type/node를 설치해 주자.

npm install --save-dev @types/node

 

그런 다음 tscofnig.json 파일에 compilerOptions 단락에서 esModuleInterop를 활성화 해주고, types에 node를 추가해서 cluster를 인식할 수 있도록 수정해 준다.

{
  "compilerOptions": {
	/* 기존항목들 */
    "esModuleInterop": true,
    "types": ["node"]
  }
}

 

그리고 main.ts 파일에서 cluster를 불러와 실행해 주면 된다.

다음을 참고하여 수정하자.

 

import * as cluster from 'cluster';
import * as os from 'os';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';

const dotenv = require('dotenv');

async function bootstrap() {
  if (cluster.default.isPrimary) {
    dotenv.config();
    
    for (let i = 0; i < os.cpus().length; i++) {
      cluster.default.fork();
    }

    cluster.default.on('exit', (worker, code, signal) => {
      console.log(`Worker ${worker.process.pid} died`);
    });
  } else {
    const app = await NestFactory.create(AppModule);

    const config = new DocumentBuilder()
      .setTitle('Your API Title')
      .setDescription('Your API Description')
      .setVersion('1.0')
      .addTag('nestjs-swagger-example') // optional
      .build();

    const document = SwaggerModule.createDocument(app, config);
    SwaggerModule.setup('api', app, document);
    app.enableCors(); 
    await app.listen(3000);
  }
}

bootstrap();

 

주의할 점은 만약 환경을 .env 파일로 분리하여 사용하고 있다면, dotenv를 이용해 클러스터로 나누기 전에 .env 파일을 불러와서 적용해야 한다는 점이다.

물론 필요한 경우 dotenv를 설치해 주어야 한다.

npm install dotenv

 

이제 서버를 동작시키고 Swagger에 접속하면 원활히 접속하는 것을 볼 수 있다.

반응형