๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

javascript/[TIL] ๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ 

๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ  - Koa ํ”„๋ ˆ์ž„์›Œํฌ, nodemon, koa-router

728x90

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, ์ด๋ฆ„ ๋“ฑ ํŠน์ • ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹œ ์‚ฌ์šฉ

์ฟผ๋ฆฌ๋Š” ์˜ต์…˜์—(์กฐ๊ฑด, ์ •๋ ฌ ๊ธฐ์ค€) ๊ด€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜จ๋‹ค.

728x90