티스토리 뷰

목차

    반응형


    프레임워크 요구 기능

    • 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에 대응하지 않아 수정이 필요


    이중에서 필요한 기능을 기본 제공 또는 플러그인으로 제공하며, 가장 성능이 가장 좋은 것을 찾아 봤습니다.


    필요한 기능 / 대응 상황

    먼저, 이번 프로젝트에 필요한 기능을 각 프레임워크가 갖추고 있는지 확인했습니다.

    이번에는 클라이언트 측 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



    반응형