티스토리 뷰
목차
프레임워크 요구 기능
- TypeScript 대응
- 라우터 기능
- 비동기 처리 지원
- 검증 기능
- 테스트 기능
TypeScript, 비동기 처리 등의 최신 개발에 필수적인 기능. 그리고 위의 기능이 요즘 프레임워크에 필요하다고 생각합니다.
어떤 프레임워크 사용할까?
지금 GitHub에서 [node framework] 라고 검색하면 약 8,000개의 저장소(Repository)가 보일만큼 수많은 Node.js 프레임워크가 존재합니다. 그 중에서 모든 것을 상세하게 비교하고 결정하는 것은 매우 어렵기 때문에, 점유율, 고성능(하이 퍼포먼스) 중에서 3개를 선택해 비교했습니다.
- express.js | https://expressjs.com/
- 프레임워크 중 점유율 1위
- 참고 : https://x-team.com/blog/most-popular-node-frameworks/
- 정보가 많고 이용자도 많지만, 속도가 느려 고성능(하이 퍼포먼스)을 요구하는 개발에 부적합. 또한 js의 비동기 처리 기능, 제너레이터(Generator) 함수, async / await에 대응하지 않아 수정이 필요
- Koa.js | https://koajs.com/ express.js
- 제작자가 개발하는 실질적인 express.js 다음 버전
- 참고 : https://backend-intro.vlpt.us/1/
- express.js 보다 속도가 빠르고 Fastify 보다 점유율이 높음. 2개 사이에 위치한 프레임워크. v1에서 제너레이터 함수, v2에서 async / await를 지원하고, express.js 보다 모던(현대적인)한 개발 환경을 지원.
- Fastify | https://www.fastify.io/ Node.js
- 프레임워크 중 성능이 가장 높음
- 참고 : https://github.com/fastify/benchmarks#benchmarks
- https://www.jishuwen.com/d/2Bal/zh-hk |
- 점유율이 낮고 정보도 적지만, 성능이 가장 좋고, async / await도 대응함. JSON Schema에 의한 검증 기능도 있고, 퍼포먼스(성능)를 강조하다 보니 비교적 세밀한 기능이 많음.
이중에서 필요한 기능을 기본 제공 또는 플러그인으로 제공하며, 가장 성능이 가장 좋은 것을 찾아 봤습니다.
필요한 기능 / 대응 상황
먼저, 이번 프로젝트에 필요한 기능을 각 프레임워크가 갖추고 있는지 확인했습니다.
이번에는 클라이언트 측 API를 제공하는 것이 목적으로 Web 서버 사이드 렌더링 등은 불필요합니다. 그래서 필요한 기능 목록에서 제거했습니다.
TypeScript 대응
TypeScript는 Microsoft에서 개발한 JavaScript의 메타 언어로 자료형 등이 추가됩니다.
JavaScript로 변환 시(트랜스 더미) 코드 안정성을 향상할 수 있으므로, TypeScript 대응은 프레임워크에서 얻고 싶은 기능 중 하나입니다.
express.js | ○
참고 : https://novemberde.github.io/node/2017/10/22/Express-Typescript.html
Koa.js | △ 플러그인이 지원
참고 : https://github.com/tkoajs/tkoa
: https://github.com/javieraviles/node-typescript-koa-rest
Fastify | ○
참고 : https://medium.com/sharenowtech/fastify-with-typescript-production-ready-integration-2303318ecd9e
: https://github.com/fastify/fastify/blob/master/docs/TypeScript.md
라우터 기능
많은 API를 만들 것으로 예상 되어서 쉽게 관리 할 수 있는 기능이 필요합니다.
express.js | ○
참고 : https://expressjs.com/ko/guide/routing.html
Koa.js | △ 플러그인이 지원
참고 : https://backend-intro.vlpt.us/2/
: https://github.com/ZijianHe/koa-router
Fastify | ○
참고 : https://github.com/fastify/fastify/blob/master/docs/Routes.md
비동기 처리 지원
DB 접속 등으로 대기가 발생하는 상황에서 콜백 함수 여러개를 함께 사용하거나, 별도로 분리해 정의해도 코드가 너무 복잡해 이해하기 어려울 수 있습니다.
그래서 async / await 처럼 시각적으로 흐름을 파악할 수 있는 기능이 필요합니다.
express.js | ×
대응 자료 : https://programmingsummaries.tistory.com/399
Koa.js | ○ v1까지는 제너레이터 함수만, v2에서 async / await 대응
참고 : https://medium.com/ninjadevs/node-7-6-koa-2-asynchronous-flow-control-made-right-b0d41c6ba570
: https://mobiarch.wordpress.com/2017/07/18/asyncawait-with-koa
Fastify | ○ async / await 대응
참고 : https://github.com/fastify/fastify/blob/master/docs/Routes.md#async-await
검증 Validation
기능 수신 데이터의 형식과 값을 쉽게 확인하고 TypeScript 형식 정보와 함께 데이터의 불일치(부적합)를 막기 위해 필요합니다.
express.js | △ 플러그인이 지원
참고 : https://express-validator.github.io/docs/
Koa.js | △ 플러그인이 지원
참고 : https://github.com/berman-solutions/koa-router-joi-validator
: https://github.com/RocksonZeta/koa-validate
Fastify | ○ JSON Schema에 의한 검증
참고 : https://github.com/fastify/fastify/blob/master/docs/Validation-and-Serialization.md
테스트 기능
API의 동작 체크를 서버 측에서만 완결하기 위해 필요합니다.
express.js | ×
대응 자료 : https://dev.to/nedsoft/testing-nodejs-express-api-with-jest-and-supertest-1km6
Koa.js | △ 플러그인이 지원
참고 : https://www.npmjs.com/package/koa-test
Fastify | △ 플러그인이 지원
참고 : https://www.fastify.io/docs/latest/Testing/
성능 퍼포먼스 비교
벤치 마크 비교 결과를 인터넷에서 찾아 보았습니다.
정보대로, Fastify 성능이 가장 높은 듯하지만, 부팅 속도가 느린 것 같습니다.
재부팅이 잦다면, 신경 쓰는 게 좋을지도 모르겠습니다.
각 컬럼의 정보 인용
Requests / s, Latency, Throughput / Mb
https://github.com/fastify/benchmarks#benchmarks
Requests / s (other data)
https://www.jishuwen.com/d/2Bal/zh-hk
AvgStartTime
https://github.com/nahtnam/fastify-benchmarks
다른 유용한 정보
Fast and low overhead web framework fastify benchmarks.
https://github.com/foxifyjs/fastify-benchmarks
Express vs Fastify performance
https://medium.com/@onufrienkos/express-vs-fastify-performance-4dd5d73e08e2