Fastify는 개발 시 비용 그리고 운영 시 비용까지 기존의 Node.JS 웹 서버 프레임워크에서 성능 저하없이 저비용으로 동작하는 프레임워크입니다. 요청과 응답 Body부터 Querystring, Param까지 모두 서버 프레임워크에서 자체적으로 그 비용을 담당할 뿐만 아니라 JavaScript 엔진 수준에서 더욱 효과적으로 동작을 고려한 프레임워크로 기존 Express, Restify 코드에서 추가적인 하드웨어 비용없이 워크로드의 처리 성능을 향상시킬 수 있게 도와줍니다.

이 글은 2021년 현재 ESNext JavaScript에 대한 기본적인 이해를 필요로 합니다.‌             ‌

Node.JS의 웹 서버 프레임워크 생태계

Node.JS에서는 오랫동안 Express가 웹 서비스에 대한 거의 완전한 솔루션으로 통해왔었습니다. 그러나 JavaScript가 프로그래밍 언어라는 면에서 성장을 거듭하면서 Express의 아키텍쳐는 특히나 Promise 처리에 굉장히 많은 단점을 안고 개발 시 비용이 증가하기 시작했습니다. 실제로 그 미들웨어 아키텍쳐의 문제 때문에 Express의 초기 개발자인 TJ는 미들웨어에서 Promise 등을 다루는 방식을 재정의한 Koa를 개발하게 되었습니다.

물론 Koa로의 전환 또한 어렵지 않습니다. 대부분의 Node.JS 서버 프레임워크는 백엔드에서 C++ 등의 네이티브 API로 바인딩을 하여 처리하지 않는 이상 http, https 패키지 위에서 만들어진 경우가 대다수이며 이는 기본적으로 http 패키지의 라이프사이클 패턴 위에서 개발이 진행됨을 의미하기 때문입니다.

그리고 Fastify 역시 이와 마찬가지입니다. http 패키지를 기반으로 만들어졌기 때문에 기존의 애플리케이션 코드와 비슷한 코드가 작성될 것입니다.

현재 블로그에서 작성되는 모든 코드는 '제 스타일'을 기준으로 작성되었습니다. 언제든지 더 좋은 '스타일'의 코드를 스스로 찾아내신다면 그 코드로 작성하는 것이 올바른 방법입니다. 또 Best pratice라는 개념은 JavaScript 생태계에서는 스니펫 형태로 되어 있는 경우가 많기도 합니다.

저는 이 시리즈에서 Fastify로 개발을 하면서 여러분의 주의할 점과 Fastify Docs를 기반으로 한 성능 튜닝 그리고 개발 비용을 줄여줄 아키텍쳐를 소개해드릴 것입니다.

Fastify 그리고 타 프레임워크

Benchmarks
Fast and low overhead web framework, for Node.js

인용하자면 Fastify는 최대한 효과적으로 동작하기 위해 바닥부터 빌드되었습니다. Fastify를 사용하는 생태계는 최대한 빠른 라이브러리와 프레임워크들로부터 더 빠르게 서비스를 운용할 수 있는 아이디어를 찾는다면 즉시 움직일 수 있는 상태이기도 합니다. 물론 이 말이 '불안정함'을 의미하는 것은 아닙니다. Fastify는 오픈소스 프로젝트이지만 믿을만한 핵심 기여자 그리고 팀을 중심으로 움직이며 굉장히 활발하게 개발이 되고 있습니다.

그리고 위 페이지에서 확인하실 수 있듯 성능 상 선택의 여지가 없기도 합니다. 벤치마크 결과는 서비스 코드에 영향을 미칠 때 CI에 의해 업데이트됩니다.

굳이 더 말할 필요없이 Fastify를 선택해야 하는 이유 중 1순위는 단연 성능입니다. 물론 이것뿐만 아닙니다. 단순히 Fastify를 성능으로 선택해야 하는 이유보다 더 큰 복병들이 숨어있을 수 있기 때문입니다. 예를 들어서 다음의 것들입니다:

성능을 포기하는 대신...

  • Routing 정의의 굉장한 불편함
  • Testing 코드 작성의 불편함
  • Middleware의 지원 여부

하지만 저는 Fastify가 거의 대부분의 경우에서 Express 생태계를 넘어설 정도로 완벽하고 편안한 개발 비용과 러닝 커브를 가지고 있다고 생각합니다. 그 이유는 다음과 같습니다:

성능을 챙기고도...

  • Callback-like를 포함한 전 라이프사이클에서 완벽한 비동기 지원
  • 서버를 실행시키지 않고도 자체적으로 Request를 주입하여 테스트 지원
  • 프레임워크 단에서 지원하는 Body, Header, Param, Querystring, 그리고 Response의 AJV JSON Schema Validation

앞으로 그리고 이것보다 더 많은 장점을 경험하게 되실 것입니다. 최종적으로 모든 것들이 한데모여 더욱 편한 개발 경험을 제공하게 됩니다. 편한 개발 경험 그리고 동시에 마찰없는 높은 성능까지 얻게 되는 가장 쉬운 방법일 것입니다.