Development

Koa vs Express 비교 (2020)

OG(오지) 2020. 3. 12. 10:39

안녕하세요. 휴몬랩 OG입니당.

 

지금 저는 회사 서비스의 백엔드(서버, API)를 아주 그냥 뒤엎고 (ㅠㅠ) 있습니다. DB도 새로 구축하고, 그러면서 서비스 API 또한 새로 만들어야 하는 상황에 있습니다.

본격적인 개발에 들어가기 전, 어떤 방식으로 가야할지 방향성과 도구들에 대해 리서치해보는 시간을 가졌습니다. 처음 백엔드를 구축하고 2년이 지났으니 그동안 많은 업데이트와 라이브러리들의 싸움이 있었을 거니까요!

 

고민하던 중 2016년에 만들어졌던 koa가 express와 대적할만한 존재가 되었다는 걸 알았습니다 ! (벌써 4년이 지났으니까요..) 이런 저런 자료를 찾아보며 고민한 끝에 기존 express로 구축되어 있던 걸 이번엔 koa로 만들어보기로 했습니다.

둘을 비교해보기 위해 koa vs express라고 검색했을 때 최근 자료가 거의 없고, 특히 한글 자료는 더더욱 없더라구요. 그래서 이번에는 비교적 최근 글 중 가장 내용이 탄탄한 외부 글을 중요한 내용 위주로 번역하여 공유하려 합니다.

Reference

원본 글 업로드 일자: 2019년 7월

출처: https://savvycomsoftware.com/express-koa-or-hapi-better-performance-with-the-right-nodejs-framework/

  • 기존 글은 Koa, Express, Hapi를 비교하지만 저는 Koa와 Express만 비교하였습니다.
  • 완벽한 번역 글은 아닙니다. 중요한 내용만 추려서 공유하는 글입니다. 따라서 원본 글은 위의 링크로 가서 확인해주세요 :)

개요

2009년 처음 만들어진 이후, Node.js는 javascript 기반 오픈소스(엄밀히 말하면 javascript 기반 크로스플랫폼 runtime environment) 중 가장 빠르게 성장하였습니다. 따라서 Node.js 기반으로 많은 웹 프레임워크들이 생성되었죠.

각 프레임워크들은 사용자(개발자)들의 요구에 맞춰 생산성, 확장성, 개발 생산성, 성능을 높여왔습니다. Node.js 는 그러한 웹 프레임워크들의 성장에 힘입어 인기를 끌고 있고 개발자들 사이에서 꼭 고려해야 할 선택지로 자리잡았습니다.

가장 널리 쓰이고 있는 Node.js의 웹 프레임워크(Express, Koa)를 소개하고 차이점을 알려드리려 합니다. Express와 Koa 중 고민하고 있는 분들에게 도움이 되었으면 좋겠습니다.

TL;DR

  • Express 만든 팀이 2016년에 Koa를 만들었습니다.
  • Express는 뼈대로 설치되는 모듈이 많고, 미들웨어를 붙일 때 꼭 Express 기반이어야 합니다.
  • Koa는 뼈대로 설치되는 모듈이 적고, customizing이 자유롭습니다.
  • Koa는 태생이 es6 기반이기 때문에 async/await를 지원하여 try-catch 에러 처리가 필요없습니다.
  • Express는 community가 매우매우매우 강력합니다. 또한 Node.js를 처음 접할 때는 당연히 express로 배운다는 관념?이 아직은 만연한듯 합니다. (애초에 깔려있는 게 많으니 초보자에게 좋다는 말에 동의하긴 합니다.)

요약

Express

  • Github 47600 stars (2020)
  • npm 주간 다운로드 수 - 11,877,830 (2020)

Express는 내장 되어있는 코드와 설계 요소, 미들웨어가 많습니다. 개발자들이 쉽게 퍼포먼스를 올릴 수 있게 하겠다!는 목표로 만들어졌습니다. 개발자 마음대로 외부 미들웨어를 붙이기 힘듭니다. (Express 자체를 '완고하다'라고 표현합니다.)

모든 2009년부터 개발되었기 때문에 Express의 장점은 강력한 커뮤니티와 레퍼런스입니다. Express 기반의 웹도 많습니다.

Koa

  • Github 28600 stars (2020)
  • koa 주간 다운로드 수 - 408,459 (2020)

Koa는 2016년 Express 팀이 만든 웹 프레임워크입니다. (Express는 IBM에 팔렸고,... 비하인드가 재밌더라구요.) Express 보다 기본으로 설계된 뼈대가 적지만 탄탄합니다. Express보다 모듈화되어있어 원하는 대로 미들웨어 붙이기가 좋습니다.

비교적 최근 만들어졌기 때문에 es6 기반으로 되어있어 async-await 오류를 try-catch 없이 잡아낼 수 있습니다. (Express는 불가능) 또한 콜백 지옥에서 벗어날 수 있습니다..

비교(1) 기본 Setup

Koa와 Express를 같은 팀이 만들어서인지 Setup 방식은 똑같습니다.

 

*Express

const express = require('express'); 
const app = express(); 
const PORT = process.env.PORT || 3000; 
const server = app.listen(PORT, () => { 
	console.log(`Express is listening to <http://localhost>:${PORT}); 
});

*Koa

const koa = require('koa'); 
const app = express(); 
const PORT = process.env.PORT || 3000; 
const server = app.listen(PORT, () => { 
	console.log(`Koa is listening to <http://localhost>:${PORT}); 
});

비교(2) Middleware

Middleward 사용 방식도 비슷합니다. app.use() 함수를 이용합니다. 다만 Express는 req, res context를 이용하는 대신 Koa는 ctx object를 사용합니다. 또한 Koa는 middleware를 정의할 때 async/await 개념을 적용할 수 있습니다.

 

*Express

app.use((req, res, next) => { 
	console.log(`Time : ${Date.now()}`); 
    next(); 
});

*Koa

app.use(async (ctx, next) => { 
	console.log(`Time: ${Date.now()}`); 
    await next(); 
});

비교(3) Hello world example & 성능

기본적으로 callback을 멈추고 에러를 처리하는 성능이 더 좋기 때문에 Koa가 가볍습니다. 

 

*Express → 38510 req/sec

const express = require('express'); 
const app = express(); 
const port = 3000; 
app.get('/', (req, res) => res.send('Hello world!')); 
app.listen(port, () => console.log(`Example app listening on port ${port}!`));

 

*Koa → 50933 req/sec

const Koa = require('koa'); 
const app = new Koa(); 
app.use(async ctx => ctx.body = 'Hello world' }); 
app.listen(3000);

요약

  • Express : 가장 기본적인 표준으로 인식되고 있음. 대부분의 미들웨어가 지원되며 가벼움.
  • Koa : Async/await 가 지원된다. 최근 가장 핫한 프레임워크.

계속 분석하다보니 파이썬 기반 웹 프레임워크 중 Koa는 flask와 비슷하고, Express는 Django와 비슷한 느낌이었습니다. flask-Django보다는 Koa-Express가 부모가 같아서 그런지 좀 더 비슷합니다.

 

Express 만든 팀이 Koa를 만들었으니.. 뭔가 둘다 타겟층이 다르고 둘다 필요하니까 만들지 않았을까? 라는 생각이 듭니다. Koa와 Express 모두 장단점이 있으니 상황이나 개발하고자 하는 프로젝트 크기, 개발자 등등을 고려하여 웹 프레임워크를 선택하면 될 듯 합니다.