[nodejs] Fastify 확장성 개선 방법

이번 포스트에서는 Fastify 애플리케이션의 확장성을 개선하는 방법에 대해 알아볼 것입니다. Fastify는 성능 면에서 우수한 프레임워크이지만, 애플리케이션의 규모가 커짐에 따라 확장성을 유지하는 것이 중요합니다.

1. 플러그인을 활용한 모듈화

Fastify는 플러그인을 통해 애플리케이션을 모듈화하는 기능을 제공합니다. 애플리케이션의 기능을 각각의 플러그인으로 분리하여 개발하면 코드 유지보수가 용이해지고, 테스트하기도 쉬워집니다. 또한, 신규 기능을 추가하거나 기존 기능을 갱신할 때도 다른 부분에 영향을 미치지 않으므로 개발 생산성 또한 향상됩니다.

아래는 간단한 Fastify 플러그인의 예시입니다.

const fp = require('fastify-plugin')

module.exports = fp(async function (fastify, opts) {
  fastify.decorate('utility', function () {
    return 'example utility function'
  })
})

2. 스키마 및 유효성 검사

Fastify는 JSON 스키마를 활용하여 요청 및 응답의 유효성을 검사할 수 있는 기능을 제공합니다. 이를 통해 애플리케이션의 안정성을 높일 수 있으며, 문서화된 스키마를 통해 API 문서를 자동으로 생성할 수 있습니다.

다음은 Fastify에서 JSON 스키마를 활용한 라우트 핸들러의 예시입니다.

fastify.post('/user', {
  schema: {
    body: {
      type: 'object',
      required: ['name', 'email'],
      properties: {
        name: { type: 'string' },
        email: { type: 'string', format: 'email' }
      }
    }
  }
}, async function (request, reply) {
  // 요청 본문의 유효성 검사 후 로직 수행
})

3. 클러스터링

클러스터링을 활용하면 멀티 코어 환경에서 Fastify 애플리케이션의 확장성을 높일 수 있습니다. 클러스터링을 통해 각 워커 프로세스가 병렬로 요청을 처리함으로써 시스템 자원을 효율적으로 활용할 수 있습니다.

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

if (cluster.isMaster) {
  // 마스터 프로세스 로직
  // 워커 프로세스 생성
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork()
  }
} else {
  // 워커 프로세스 로직
  // Fastify 애플리케이션 구동
  const fastify = require('fastify')()
  fastify.listen(3000)
}

Fastify 애플리케이션을 개발하거나 유지보수할 때 이러한 기술적인 접근 방식을 활용하여 확장성을 높일 수 있습니다. 이를 통해 성능과 안정성을 유지하며, 대규모 트래픽에도 우수한 성능을 발휘할 수 있습니다.