Node.js 웹 애플리케이션 프레임워크? express vs koa

noyo0123·2019년 10월 24일
2

왜 koa를 쓸까요?

멘토분께서 koa로 개발을 하자고 해서 서버를 koa로 구현한 적이 있어요.
그런데 왜 koa를 쓸까에 대한 의문은 있었어요.
koa... 열심히 구글링 해본 결과
es6 async await이 지원이 된대요. 이게 뭔말이에요?
express도 async await 쓸 수 있는데요??

좀더 자세히 찾아본 결과
support async await을 정확히 짚어준 블로그를 찾았고요.
직접 눈으로 확인해보기 위해서 다음과 같이 express로 서버를 만들고 koa로도 서버를 만들어서 비교를 해봤습니다.

express 준비

여기에 npm 사용자 정의 명령어를 추가해줍니다.

사용방법
터미널에서 다음과 같이 명령어를 입력해줍니다.

특별한 명령어도 있어요.
start, test 등은 npm start, npm test 처럼 run을 안붙여도 되요.

패키지 설치

body-parser는 express에 내장되었습니다.

프로젝트 디렉토리

결과적으로 package.json은 다음과 같습니다.

babel.config.js도 루트디렉토리에 만들었어요.

이제 서버를 구현해볼게요.
app.js를 루트 디레토리에 생성합니다.

이제 서버를 실행해놓고요.

postman으로 요청을 보낼게요.

express는 async 내부에서 발생하는 에러를 핸들링하지 못해요.

image.png

만약 이렇게 처리가 되지 않은 Promise reject때문에 서버 앱이 종료되면 매우 위험해집니다.

try catch로 잡아볼게요.
라우터 부분만 바꿨습니다.

try catch 적용후

에러를 잡습니다.

image.png

express에서는 async 내부에서 발생한 에러를 try catch로 잡아야합니다.


koa 준비

이제 koa로 서버를 만들어볼게요.

koa는 router, body-parser 까지 모듈로 쓴다는 것도 express와 차이점으로 얘기할 수 있겠네요.

프로젝트 구조는 다음과 같습니다.

package.json

babel.config.js

koa로 할때는요. 에러가 발생하는거에요.
image.png

그래서 stackoverflow에서 방법을 찾아서 해결했습니다. babel 7버전이 문제라고 하네요.

app.js를 만들었어요.

서버를 실행해놓고

postman으로 요청을 날려볼게요.

koa는요 core도 async await으로 구현이 되어있대요.
express와 달리 async 내에서 발생하는 에러에 대해서
에러를 잡을 수가 있어요. try catch문이 없어도요.

image.png

레퍼런스 : from express to koa - HISWEPEDIA
레퍼런스 : Express 라우트에서 Async Await를 사용하려면? - Changjoo Park
레퍼런스 : ReferenceError: regeneratorRuntime is not defined - stackoverflow
레퍼런스 : koa를 사용하여 웹서버 만들기 - velopert
레퍼런스 : Why is Koa better than Express when async await is enabled for both? - reddit
레퍼런스 : Error - MDN
레퍼런스 : How to choose the best Node.js framework: Express.js, Koa.js or Sails.js - Cleveroad

정리

사실 express, koa 둘다 오래 써보지 않았습니다.
그러나 제가 경험한 것만 말씀 드리자면
1. koa는 core에서부터 async await이 지원이 되기 때문에요 async 내부에서 발생하는 에러도 try catch가 없이 에러 핸들링 할 수 있습니다.

  1. 그리고 koa는 express에 비해 모듈화 되어있어요. 기본적인 것도 포함되지 않아요. 심지어, router, body-parser도요.
    https://github.com/koajs/koa/wiki 모듈은 여기서 골라서 사용하시면 됩니다.
    제가 사용했던것은 koa-routerkoa-body였습니다.
profile
자바스크립트를 주언어로 개발을 배우고 있습니다. 서로 아는 것들을 공유해요~

1개의 댓글

comment-user-thumbnail
2019년 10월 25일

저도 이번에 SideProject로 koa를 도입하려고 공부했는데,

생각해보니 try~catch를 사용하지 않고 있었네요. 잘 읽고 갑니다 :)

답글 달기