Node.js ํ๊ฒฝ์์ ์น ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ Koa ์น ํ๋ ์์ํฌ
1. Koa๋ ํ์ํ ๊ธฐ๋ฅ๋ค๋ง ๋ถ์ฌ์ ์๋ฒ๋ฅผ ๋ง๋ค ์ ์๋ค.
Koa๋ ๋ฏธ๋ค์จ์ด ๊ธฐ๋ฅ๋ง ์์ผ๋ฉฐ ๋๋จธ์ง๋(๋ผ์ฐํ , ํ ํ๋ฆฟ ํ์ผ ํธ์คํ ๋ฑ) ๊ธฐ๋ฅ๋ค์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ฉํ์ฌ ์ฌ์ฉํ๋ค.
(๋ฌด๊ฒ : koa < Express
Express๋ ๋ฏธ๋ค์จ์ด, ๋ผ์ฐํ , ํ ํ๋ฆฟ ํ์ผ ํธ์คํ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด์๋ค.)
2. Koa๋ async/await ๋ฌธ๋ฒ์ ์ ์์ผ๋ก ์ง์ํด ๋น๋๊ธฐ ์์ ์ ๋ ํธ๋ฆฌํ๊ฒ ๊ด๋ฆฌ ํ ์ ์๋ค.
Koa ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
0. Koa ์น ํ๋ ์์ํฌ ์ค์นํ๊ธฐ
yarn add koa
1. ์๋ฒ ๋์ฐ๊ธฐ
const Koa = require('koa');
const app = new Koa();
// app.use() : ๋ฏธ๋ค์จ์ด ํจ์๋ฅผ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฑ๋กํจ.
app.use(ctx=>{
ctx.body='hello world'
});
app.listen(4000, () => {
console.log('Listen to port 4000');
});
Koa์ ๋ฏธ๋ค์จ์ด ํจ์์ ๊ตฌ์กฐ
(ctx, next) => { }
ctx : Context์ ์ค์๋ง, ์น ์์ฒญ๊ณผ ์๋ต์ ๋ํ ์ ๋ณด๋ฅผ ์ง๋ (ctx.params, ctx.query ๋ฑ์ผ๋ก ์ฌ์ฉ) |
next : ํ์ฌ ์ฒ๋ฆฌ์ค์ธ ๋ฏธ๋ค์จ์ด์ ๋ค์ ๋ฏธ๋ค์จ์ด๋ฅผ ํธ์ถํ๋ ํจ์ (Promise๋ฅผ ๋ฐํ - ๋ค์ ์ฒ๋ฆฌํ ๋ฏธ๋ค์จ์ด๊ฐ ๋๋์ผ ์๋ฃ.) next ํจ์๋ฅผ ํธ์ถํ์ง ์์ผ๋ฉด, ๊ทธ๋ค์ ๋ฏธ๋๋ฃจ์์ด๋ฅผ ์ฒ๋ฆฌํ์ง ์๋๋ค. ๋ฏธ๋ค์จ์ด๋ app.use()๋ฅผ ์ฌ์ฉํด ๋ฑ๋ก๋๋ ์์๋๋ก ์ฒ๋ฆฌ๋๋ค. ์ด๋ฅผ ์ ์ฉํด, ์กฐ๊ฑด๋ถ๋ก ๋ค์ ๋ฏธ๋ค์จ์ด ์ฒ๋ฆฌ๋ฅผ ๋ฌด์ํ๊ฒ ๋ง๋ค ์ ์๋ค, |
2. async/await ์ฌ์ฉํ๊ธฐ
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx, next) => {
console.log(ctx.url);
console.log('1');
if (ctx.query.authorized !== '1') {
ctx.status = 401; // Unauthorized
return;
}
await next();
console.log('END');
});
app.use((ctx, next) => {
console.log('2');
next();
});
// ์๋ฒ๋ฅผ ํฌํธ 4000๋ฒ์ผ๋ก ์ด๊ณ , ์๋ฒ์ ์ ์ํ๋ฉด 'hello word'๋ผ๋ ํ
์คํธ๋ฅผ ๋ฐํ
app.use((ctx) => {
ctx.body = 'hello world';
});
app.listen(4000, () => {
console.log('Listen to port 4000');
});
nodemon ์ฌ์ฉํ๊ธฐ
nodemon์ด๋ผ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ์๋ฒ๋ฅผ ์๋์ผ๋ก ์ฌ์์ํจ.
0. nodemon ๊ฐ๋ฐ์ฉ ์์กด ๋ชจ๋๋ก ์ค์นํ๊ธฐ
yarn add --dev nodemon
1. package.json ์์ ํ๊ธฐ (ํ๋จ ์ฝ๋ ์ถ๊ฐ)
"start:dev" : "nodemon --watch src/ src/index.js "
→ src ๋๋ ํฐ๋ฆฌ๋ฅผ ์ฃผ์ํ๋ฉฐ, ํด๋น ๋๋ ํฐ๋ฆฌ ๋ด๋ถ์ ํ์ผ ๋ณ๊ฒฝ์ ๊ฐ์งํด src/index.js ํ์ผ ์ฌ์์
"scripts": {
"start": "node src",
"start:dev" : "nodemon --watch src/ src/index.js "
}
}
2. ๋ช ๋ ์ด๋ฅผ ์ฌ์ฉํด ์๋ฒ๋ฅผ ์์ํ๊ธฐ
yarn start # ์ฌ์์์ด ํ์ ์์๋
yarn start:dev # ์ฌ์์์ด ํ์ํ ๋
koa-router ์ฌ์ฉํ๊ธฐ
Koa๋ ๋ค๋ฅธ ์ฃผ์๋ก ์์ฒญ์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํด์ผ ํ์ง๋ง,
Koa ์์ฒด์ ์ด ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ง์์, koa-router ๋ชจ๋์ ์ค์นํด์ผ ํ๋ค.
0. koa-router ์ค์นํ๊ธฐ
yarn add koa-router
1. ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
router.get(๋ผ์ฐํธ์ ๊ฒฝ๋ก, ํด๋น ๋ผ์ฐํธ์ ์ ์ฉํ ๋ฏธ๋ค์จ์ด ํจ์)
โ ์ฌ๊ธฐ์ get ํค์๋๋ ํด๋น ๋ผ์ฐํธ์์ ์ฌ์ฉํ HTTP ๋ฉ์๋๋ฅผ ์๋ฏธ (โpost, delete ๋ฑ)
const Koa = require('koa');
const Router = require('koa-router');
const app = new Koa();
const router = new Router();
// ๋ผ์ฐํฐ ์ค์
router.get('/', (ctx) => {
ctx.body = 'ํ';
});
router.get('/about', (ctx) => {
ctx.body = '์๊ฐ';
});
// app ์ธ์คํด์ค์ ๋ผ์ฐํฐ ์ ์ฉ
app.use(router.routes()).use(router.allowedMethods());
app.listen(4000, () => {
console.log('Listen to port 4000');
});
๋ผ์ฐํธ ํ๋ผ๋ฏธํฐ์ ์ฟผ๋ฆฌ
๋ผ์ฐํฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ ๋๋
/about/:name
์ฝ๋ก (:)์ ์ฌ์ฉํด ๋ผ์ฐํธ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๋ค. (๋ฆฌ์กํธ ๋ผ์ฐํฐ์ ๋น์ท)
ํ๋ผ๋ฏธํฐ๊ฐ ์์ ์๋, ์์ ์๋ ์๋ค๋ฉด → about/:name?
์ค์ ํ ํ๋ผ๋ฏธํฐ๋ ctx.params ๊ฐ์ฒด์์ ์กฐํ๊ฐ ๊ฐ๋ฅ
URL ์ฟผ๋ฆฌ, /posts/?id=10 ๊ฐ์ ํ์์ผ๋ก ์์ฒญํ๋ค๋ฉด
ํด๋น ๊ฐ์ ctx.query๋ก ์กฐํํ ์ ์๋ค.
ํ๋ผ๋ฏธํฐ์ ์ฟผ๋ฆฌ ๋ ๋ค ์ฃผ์๋ฅผ ํตํด ํน์ ๊ฐ์ ๋ฐ์์ฌ ๋ ์ฌ์ฉํ๋ค.
์ผ๋ฐ์ ์ผ๋ก
ํ๋ผ๋ฏธํฐ๋ ์ฒ๋ฆฌํ ์์ ์ ์นดํ ๊ณ ๋ฆฌ, ๊ณ ์ ID, ์ด๋ฆ ๋ฑ ํน์ ๋ฐ์ดํฐ ์กฐํ ์ ์ฌ์ฉ
์ฟผ๋ฆฌ๋ ์ต์ ์(์กฐ๊ฑด, ์ ๋ ฌ ๊ธฐ์ค) ๊ดํ ์ ๋ณด๋ฅผ ๋ฐ์์จ๋ค.