express는 미들웨어, 라우팅, 템플릿, 파일 호스팅 등과 같은 기능이 자체적으로 내장되어 있다.
그래서 express가 koa보다 무겁다.
$ node --version
$ npm init -y
프로젝트를 시작할 때 초기화를 하려면 사용한다.
$ npm add koa
먼저 서버를 여는 방법부터 알아보자.
다음 코드를 src 디렉토리를 생성하여 index.js 파일을 만든다음에 그 내부에 작성한다.
src/index.js
const Koa = require('koa');
const app = new Koa();
app.use((ctx) => {
ctx.body = 'hello world';
});
app.listen(4000, () => {
console.log('Listening to port 4000');
});
$ node src
Koa 애플리케이션은 미들웨어의 배열로 구성되어 있다.
(ctx, next) => {
}
ctx
: Context의 줄임말, 웹 요청과 응답에 관한 정보를 가지고 있다.next
: 현재 처리 중인 미들웨어의 다음 미들웨어를 호출하는 함수미들웨어는 app.use를 사용하여 등록되는 순서대로 처리한다.next()가 없으면 다음 app.use를 실행하지 않는다.
Express
와 차별되는 부분이다.next
함수가 반환하는 Promise
는 다음에 처리해야 할 미들웨어가 모두 끝나야 완료된다.
index.js
app.use((ctx, next) => {
console.log('3');
next().then(() => {
console.log('END');
});
});
app.use((ctx, next) => {
console.log('1');
next();
});
app.use((ctx) => {
console.log('2');
});
출력 순서는 '3', '1', '2', 'END' 순서대로 출력된다.
index.js
app.use(async (ctx, next) => {
// 조건부 미들웨어 처리
if (ctx.query.authorized !== '1') {
ctx.status = 401; // Unauthorized
return;
}
console.log('1');
await next();
console.log('END');
});
app.use((ctx) => {
console.log('2');
});
미들웨어에서 next() 를 기다리는것 말고도, 서버측에서 async/await 는 자주 사용되는데요. 이는 데이터베이스에 요청을 할 때 매우 유용하게 사용됩니다. 이 문법이 있으니, 콜백이 여러개 겹칠일이 없겠죠.
서버 코드를 변경할 때 마다 서버를 자동으로 재시작해주는 모듈이다.
$ npm add --dev nodemon
package.json
{
(...)
"devDependencies": {
"eslint": "^8.5.0",
"nodemon": "^2.0.15"
},
"scripts": {
"start": "nodemon src",
"start:dev": "nodemon --watch src/ src/index.js"
}
}
$ npm start
: 재시작이 필요 없을 때$ npm start:dev
: 재시작이 필요할 때