[nodejs] 더 빠른 요청 응답 전략

Node.js는 비동기 I/O 작업을 처리하고 확장성이 뛰어난 서버 측 애플리케이션을 구축하기 위한 매우 인기있는 런타임 환경입니다. 그러나 때로는 요청 응답 속도가 떨어지는 문제가 발생할 수 있습니다. 이를 극복하기 위해 몇 가지 전략을 사용할 수 있습니다.

클러스터링(Clustering)

클러스터링은 여러 개의 Node.js 프로세스를 생성하여 요청을 병렬로 처리함으로써 응답 성능을 향상시키는 전략입니다. 이를 통해 다중 코어 시스템에서 CPU 자원을 효율적으로 활용할 수 있습니다.

아래는 cluster 모듈을 사용한 간단한 예제 코드입니다.

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`마스터 프로세스 ${process.pid}이 시작되었습니다.`);

  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`워커 프로세스 ${worker.process.pid}이 종료되었습니다.`);
  });
} else {
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('안녕, 세계\n');
  }).listen(8000);

  console.log(`워커 프로세스 ${process.pid}이 시작되었습니다.`);
}

HTTP/2 사용

Node.js 8 버전부터 HTTP/2 프로토콜을 지원하고 있으며, 이를 통해 요청을 병렬로 처리하여 더 빠른 응답을 제공할 수 있습니다. HTTP/2를 사용하려면 적절한 TLS 인증서를 사용하여 HTTPS를 활성화해야 합니다.

아래는 HTTPS 서버를 생성하는 간단한 예제 코드입니다.

const https = require('https');
const fs = require('fs');

const options = {
  key: fs.readFileSync('server-key.pem'),
  cert: fs.readFileSync('server-cert.pem')
};

https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end('안녕, HTTPS!\n');
}).listen(8443);

정적 콘텐츠 캐싱

정적 콘텐츠(이미지, CSS, JavaScript 등)에 대한 캐싱을 통해 반복적인 요청에 대한 응답 시간을 줄일 수 있습니다. Node.js의 express와 같은 웹 프레임워크에서는 쉽게 정적 콘텐츠를 캐싱할 수 있는 기능을 제공합니다.

이러한 전략들을 적용하여 Node.js 애플리케이션의 응답 성능을 향상시킬 수 있습니다.

참고 자료