๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœ๏ธ 21-2 IPP/Node.js study

Node.js - 10 Express.js

by hanwitjus 2021. 10. 21.

์—ฌํƒœ๊นŒ์ง€๋Š” Node.js๋ฅผ ํ†ตํ•ด ์›น ์„œ๋ฒ„๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€, ๋‚ด๋ถ€ ๋ชจ๋“ˆ์„ ํ™œ์šฉํ•ด ์–ด๋–ป๊ฒŒ ์˜๋ฏธ ์žˆ๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š”์ง€ ๋ฐฐ์› ๋‹ค. 

 

์ด์ œ๋Š” ๋™์  ์ฝ˜ํ…์ธ ์™€ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์ข€ ๋” ๋ฐœ์ „๋œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ด ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 

๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์„œ ํ•ด๋ณธ ๊ฒƒ์€ Express.js๋ฅผ ์‚ฌ์šฉํ•œ ์›น ๊ฐœ๋ฐœ์ด๋‹ค.

 

๋จผ์ €, Express.js๊ฐ€ ๋ญ”์ง€ ์‚ดํŽด๋ณด์ž๋ฉด

 

Express.js๋Š” ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์˜ฌ๋ ค์ฃผ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์•ˆ์ •์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

Express.js๋Š” ๋Œ€๋ถ€๋ถ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฆ‰์‹œ ํ•„์š”ํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋‚˜ ์ •์  ์—์…‹ ํ•ธ๋“ค๋ง๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

=> ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ๋„์™€์ฃผ๊ณ , ๋™์  ๋ฐ ์ •์  ์ปจํ…์ธ ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ์‚ฌ์šฉ์ž ํ–‰๋™์„ ์ถ”์ ํ•˜๋Š” ๋ชจ๋“ˆ๊ณผ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

Express.js์™€ ๊ฐ™์€ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋ณดํ†ต ๋ฏธ๋“ค์›จ์–ด๋กœ ์šด์˜๋œ๋‹ค.

ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์œ„์น˜๊ฐ€ ์›น ์ƒ์˜  HTTP์™€ Node.js ํ”Œ๋žซํผ ์‚ฌ์ด์ด๊ธฐ ๋•Œ๋ฌธ.

 

๋ฏธ๋“ค์›จ์–ด๋ž€? ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง๊ณผ์˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜ ์ „์— ๋Œ€๊ธฐํ•˜๊ณ , ๋ถ„์„ํ•˜๊ณ , ํ•„ํ„ฐ๋งํ•˜๊ณ , HTTP ํ†ต์‹ ์„ ๋‹ค๋ฃจ๋Š” ์ฝ”๋“œ๋ฅผ ์ผ์ปซ๋Š” ์ผ๋ฐ˜ ์šฉ์–ด์ด๋‹ค.

 

 

Express.js๋Š” ์™ธ๋ถ€ ํŒจํ‚ค์ง€์ด๊ธฐ ๋•Œ๋ฌธ์— Node.js ์„ค์น˜ ์‹œ ๊ฐ™์ด ์„ค์น˜๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ๋”ฐ๋กœ ์„ค์น˜ํ•ด์•ผํ•œ๋‹ค.

npm install express --save

๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

 

 

 

express ๋ณ€์ˆ˜์— Express.js๋ฅผ ์š”์ฒญํ•˜์—ฌ ์ƒ์ˆ˜๋กœ ์ €์žฅํ•œ๋‹ค.

express ์›น ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ app์œผ๋กœ ์ฐธ์กฐ๋˜๋Š” ์ƒ์ˆ˜๋กœ ์ €์žฅ๋œ๋‹ค.

 

์ฒซ๋ฒˆ์งธ ์บก์Šคํ†ค ํ”„๋กœ์ ํŠธ์—์„œ ์ฒ˜๋Ÿผ, Express.js๋Š” ๋ณ„๋„์˜ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ์“ฐ์ง€ ์•Š๊ณ  GET๋ผ์šฐํŠธ ์ •์˜ ๋ฐฉ๋ฒ•๊ณผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

์—ฌ๊ธฐ์„œ ์ฃผ๋ชฉํ•ด์•ผํ•  ๋ชจ๋“ˆ์€ send ๋ชจ๋“ˆ์ด๋‹ค.

 

http์˜ write์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•˜๊ณ , ํ”Œ๋ ˆ์ธ ํ…์ŠคํŠธ ํ˜•ํƒœ๋กœ ์‘๋‹ต์„ ๋ธŒ๋ผ์šฐ์ €์— ์ „๋‹ฌํ•œ๋‹ค.

 

(write๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ end๋กœ ๋งˆ๋ฌด๋ฆฌ ํ•ด์•ผํ•œ๋‹ค.)

 

๊ทธ๋ž˜์„œ ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด 

"Hello Universe!"๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ๋œจ๊ฒŒ ๋œ๋‹ค.

 

 

 

Express.js๋กœ ๋ผ์šฐํŠธ ๋งŒ๋“ค๊ธฐ

 

Express.js์—์„œ๋Š” app ๊ฐ์ฒด๋กœ ๋ผ์šฐํŠธ์˜ ์ •์˜๊ฐ€ ์‹œ์ž‘๋˜๋ฉฐ (์˜ˆ: app.post()),

์†Œ๋ฌธ์ž๋กœ ๋œ HTTP ๋ฉ”์†Œ๋“œ์™€ ๋ผ์šฐํŠธ ๋ฐ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๊ฐ™์€ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์˜ํ•ด ์ง€์›๋œ๋‹ค.

 

'/contact' url์— ๋”ฐ๋ฅธ post ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•œ ์š”์ฒญ ์ฒ˜๋ฆฌ๋Š”

 

์ด๋ ‡๊ฒŒ Express.js ์—์„œ ์ œ๊ณตํ•˜๋Š” post ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

 

 

 

๋˜ Express.js๋Š” ๊ฒฝ๋กœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

๋ผ์šฐํŠธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์•ž์— ์ฝœ๋ก (:)์ด ๋ถ™์œผ๋ฉฐ ๊ฒฝ๋กœ ์–ด๋””์—๋ผ๋„ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

 

์—ฌ๊ธฐ์„œ ๊ฒฝ๋กœ๊ฐ€ "items/lettuce"๋กœ ์œ ์ž…๋œ๋‹ค๋ฉด, ์œ„์˜ ํ•จ์ˆ˜๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ ๋  ๊ฒƒ์ด๋‹ค. 

 

๋ผ์šฐํŠธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด ์ง€์ • ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ํ™•์ •ํ•  ๋•Œ ๊ฐ„ํŽธํ•˜๋‹ค.

์‚ฌ์šฉ์ž ๊ณ„์ •๊ณผ ์ฝ”์Šค ๋ชฉ๋ก์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋ ค๊ณ  ํ•  ๋•Œ

/users/:id์™€  /course/:type์œผ๋กœ ์‚ฌ์šฉ์ž ์ •๋ณด์™€ ์ฝ”์Šค์˜ ์ข…๋ฅ˜๋ฅผ ์•ก์„ธ์Šค ํ•  ๊ฒƒ์ด๋‹ค. 

์ด ๊ตฌ์กฐ๋Š” REST ์•„ํ‚คํ…์ฒ˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค.

 

 

 

์š”์ฒญ ๋ฐ์ดํ„ฐ์˜ ๋ถ„์„

 

์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 2๊ฐ€์ง€์ด๋‹ค.

  • POST ์š”์ฒญ์—์„œ ์š”์ฒญ ๋ณธ๋ฌธ์„ ํ†ตํ•ด
  • URL์—์„œ์˜ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์„ ํ†ตํ•ด

http์˜ ์œ ์ž… ๋ฐ์ดํ„ฐ๋Š” ๋ฒ„ํผ ์ŠคํŠธ๋ฆผ ํ˜•ํƒœ์—ฌ์„œ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋ฅผ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ–ˆ๋‹ค. 

 

npm install body-parser --save ๋ช…๋ น์„ ์ž…๋ ฅํ•œ๋‹ค.

 

body-parser๋Š” ์œ ์ž…๋˜๋Š” ์š”์ฒญ ๋ณธ๋ฌธ์„ ๋ถ„์„ํ•˜๋Š” ๋ชจ๋“ˆ์ด๋‹ค.

์ด ๋ชจ๋“ˆ์€ Express.js์˜ ํ”„๋ฆฌ ํŒจํ‚ค์ง€ ํ˜•ํƒœ๋กœ ์„ค์น˜๋˜๋ฉฐ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ์„ ์š”์ฒญํ•˜๋ฉด ๋œ๋‹ค.

 

 

์ด๋ ‡๊ฒŒ app.use ๋ฅผ ํ†ตํ•ด URL ์ธ์ฝ”๋”ฉ์„ ์ง€์ •ํ•˜๊ณ , (26ํ–‰ ~ 30ํ–‰)

JSON ์–‘์‹์œผ๋กœ ๋œ ์œ ์ž… ์š”์ฒญ์˜ ํŒŒ์‹ฑ์„ ์ง€์ •ํ•œ๋‹ค. (32ํ–‰)

 

์ดํ›„ ํฌ์ŠคํŒ…๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•œ ๋ผ์šฐํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  body์™€ query๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

์ด์ œ curl ๋ช…๋ น์ด๋กœ

curl --data "firstname=Jon&lastname=Wexler" http://localhost:3000 ์„ ์ž…๋ ฅํ•ด๋ณด๋ฉด

{firstname: 'Jon', lastname: 'Wexler'}๊ฐ€ ์ฝ˜์†”์ฐฝ์— ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค.

 

์ง€๊ธˆ ํ•œ ๊ฒƒ์€ post ์š”์ฒญ์„ ๋ณด๋‚ธ๊ฑด๋ฐ, url ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ณด๋‚ด๋ณด์•˜๋‹ค.

http://localhost:3000?cart=3&pagesVisited=4&utmcode=837623 ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๋ฉด

์ฒซ๋ฒˆ์งธ ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ

{cart: '3', pagesVisited: '4', utmcode: '837623'}์ด ์ž˜ ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค.

 

์•„๋ž˜๋Š” ๊ฒฐ๊ณผ ํ™”๋ฉด์ด๋‹ค.

 

 

 

 

 

MVC์˜ ์‚ฌ์šฉ

 

๋ฐ๋ฒ ํ”„ ์†Œ์‹œ๊ฐœ์— ์ด์–ด ์—ฌ๊ธฐ์—์„œ๋„ ๋‚˜์˜ค๋Š” MVC ๊ตฌ์กฐ... ์›น๊ฐœ๋ฐœ์—์„œ ์ค‘์š”ํ•˜๊ธด ํ•œ๊ฐ€๋ณด๋‹ค.

MVC ๊ตฌ์กฐ๋Š” ์ž˜ ์•Œ๊ณ ์žˆ๋‹ค ์‹œํ”ผ Model, View, Controller๋ผ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ 3๊ฐ€์ง€ ๋ฉ”์ธ ๊ธฐ๋Šฅ์— ํฌ์ปค์Šค๋ฅผ ๋งž์ถฐ ๊ฐœ๋ฐœํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๋งํ•œ๋‹ค.

 

๊ทธ๋ž˜์„œ ๊ทธ ์•„ํ‚คํ…์ณ์— ๋งž์ถฐ ์›๋ž˜ ์žˆ๋˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณ ์น˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์ณค๋‹ค.

  1. ํ”„๋กœ์ ํŠธ ํด๋”์— controllers ํด๋”๋ฅผ ๋งŒ๋“ ๋‹ค.
  2. controllers ํด๋” ์•ˆ์— homeController.js ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค.
  3. main.js ํŒŒ์ผ์˜ ์ตœ์ƒ๋‹จ์— const homeController = require("./controllers/homeController") ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ํ™ˆ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
  4. ๋ผ์šฐํŠธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ™ˆ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์˜ฎ๊ฒจ ํ•ด๋‹น ๋ชจ๋“ˆ์˜ export ๊ฐ์ฒด์— ์ถ”๊ฐ€ํ•œ๋‹ค.

 

homeController.js ํŒŒ์ผ์€ ์ด๋ ‡๊ฒŒ ์ •์˜๋ฅผ ํ•˜๊ณ ,

 

 

main.js์—์„œ ์ด๋ ‡๊ฒŒ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

 

LIST

๋Œ“๊ธ€