1-2. Koa 기본 사용법
Hello Koa
먼저 서버를 여는 방법부터 알아보겠습니다. 다음 코드를 src 디렉토리를 생성하여 index.js 파일을 만든다음에 그 내부에 작성을 하세요.
src/index.js
const Koa = require('koa');
const app = new Koa();
app.use(ctx => {
ctx.body = 'Hello Koa';
});
app.listen(4000, () => {
console.log('heurm server is listening to port 4000');
});
서버를 작성했으니, 한번 실행을 해볼까요?
$ node src
heurm server is listening to port 4000
이제, 브라우저로 http://localhost:4000/ 에 들어가시면, Hello Koa 라는 텍스트가 보일 것 입니다.
미들웨어
Koa 어플리케이션은, 미들웨어의 배열로 구성되어있습니다. 우리가 위 코드에서 app.use
라는 함수를 사용했었지요? 이 코드는 미들웨어를 어플리케이션에 등록을 해줍니다.
app.use(ctx => {
ctx.body = 'Hello Koa';
});
여기서 ctx => { ... }
코드가, 하나의 미들웨어 인 것이지요. koa 의 미들웨어함수에선, 두가지의 파라미터를 받습니다. 첫째는 위 코드에서도 나오는 ctx
이구요, 두번째는 next
입니다.
ctx
는, 웹 요청과, 응답에 대한 정보를 지니고있고, next 는 다음 미들웨어를 실행시키는 함수입니다. 만약에 미들웨어에서 next 호출하지 않게 된다면, 그 부분에서 요청처리를 완료시키고, 응답을 하게됩니다.
그리고, 미들웨어는, 등록하는 순서대로 실행을 하게 됩니다. 우선 다음과 같이 기록을 하는 미들웨어 두개를 기존 미들웨어 상단에 넣어보세요.
src/index.js
const Koa = require('koa');
const app = new Koa();
app.use(ctx => {
console.log(1);
});
app.use(ctx => {
console.log(2);
});
app.use(ctx => {
ctx.body = 'Hello Koa';
});
app.listen(4000, () => {
console.log('heurm server is listening to port 4000');
});
이제 브라우저에서 http://localhost:4000/ 에 들어가게 된다면, Not Found 가 뜨고, 터미널쪽에선 다음과 같이 기록이 될 것입니다.
$ node src
heurm server is listening to port 4000
1
그 다음 미들웨어를 실행하지 않고, 첫번째 미들웨어에서 멈춰버렸죠?
이는, next()
를 호출하지 않았기 때문입니다. 함수의 파라미터 부분에 next 를 받아와서 호출을 해보세요.
app.use((ctx, next) => {
console.log(1);
next();
});
app.use((ctx, next) => {
console.log(2);
next();
});
$ node src
heurm server is listening to port 4000
1
2
이제, 우리가 예상했던대로 작동합니다.
next() 는 프로미스
next() 를 실행하면, 프로미스를 반환합니다. 따라서, 작업들이 끝나고 나서 할 작업들을 정해줄 수도 있습니다.
첫번째 미들웨어의 코드를 다음과 같이 수정하고, 다시 페이지를 열어보세요.
app.use((ctx, next) => {
console.log(1);
const started = new Date();
next().then(() => {
console.log(new Date() - started + 'ms');
});
});
$ node src
heurm server is listening to port 4000
1
2
1ms
코드를, Express 처럼 콜백 위주로만 한다면, 이런걸 하기는 굉장히 번거롭습니다. 하지만 Koa 에서는 매우 편하죠.
async/await 사용하기
Koa 에선 별도의 작업없이 async/await
를 바로 사용 할 수 있습니다. 방금 작성했던 미들웨어를, async/await
을 통하여 재작성해보겠습니다.
app.use(async (ctx, next) => {
console.log(1);
const started = new Date();
await next();
console.log(new Date() - started + 'ms');
});
이 코드는 아까랑 동일하게 작동 할 것입니다. 이렇게 미들웨어에서 next() 를 기다리는것 말고도, 서버측에서 async/await
는 자주 사용되는데요. 이는 데이터베이스에 요청을 할 때 매우 유용하게 사용됩니다. 이 문법이 있으니, 콜백이 여러개 겹칠일이 없겠죠.