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

Node.js - 9 ์บก์Šคํ†ค ํ”„๋กœ์ ํŠธ: ์ฒซ๋ฒˆ์งธ ์›น

by hanwitjus 2021. 10. 21.

์ฒซ๋ฒˆ์งธ ๊ธฐ๋ณธ์ ์ธ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ, ์ „์ œ ์„ค์ •์€ ์ด๋ ‡๋‹ค.

์ง€์—ญ ์š”๋ฆฌ ํ•™๊ต Confetti Cuisine์—์„œ ์ž์‹ ๋“ค์ด ์ œ๊ณตํ•˜๋Š” ์ฝ”์Šค์™€ ๋ ˆ์‹œํ”ผ ๊ทธ๋ฆฌ๊ณ  ์˜ˆ๋น„ ํ•™์ƒ๋“ค์ด ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์ด ์žˆ๋Š” ๋žœ๋”ฉ ํŽ˜์ด์ง€๋ฅผ ๊ฐ–๊ณ  ์‚ฌ์ดํŠธ๋ฅผ ๊ตฌ์ถ•ํ•ด์ค„ ๊ฒƒ์„ ์˜๋ขฐํ•œ ์„ค์ •.

 

์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค.

 

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ package.json์˜ ์ดˆ๊ธฐํ™”
  • ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ ์…‹์—…
  • main.js์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง ๋งŒ๋“ค๊ธฐ
  • view (html) ์ƒ์„ฑ -> Index, Course, Contact, Thanks, Error
  • ์—์…‹์˜ ์ถ”๊ฐ€
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ผ์šฐํŠธ ๊ตฌ์„ฑ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰

 

1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ดˆ๊ธฐํ™”

 

์šฐ์„  npm์„ ์‚ฌ์šฉํ•ด package.json ํŒŒ์ผ์„ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  npm install http-status-codes --save ๋ช…๋ น์–ด๋กœ ์ข…์† ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

 

์•ž์—์„œ ํ•ด๋ดค๋˜ ๋‚ด์šฉ์ด๋ผ ์ƒ๋žต.

 

 

 

2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ

 

ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งŒ๋“ค์—ˆ๋‹ค.

 

views ์•ˆ์— ์žˆ๋Š” html ํŒŒ์ผ๋กœ ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•˜๊ณ , ์ด ํŒŒ์ผ๋“ค์„ ์ง€์›ํ•˜๋Š” ์—์…‹์€ public ํด๋” ๋ฐ‘์— ์žˆ๋‹ค.

 

 

 

3. router.js ๋ฐ main.js ํŒŒ์ผ์˜ ์ƒ์„ฑ

 

๋จผ์ € main.js์˜ 1ํ–‰๋ถ€ํ„ฐ 6ํ–‰๊นŒ์ง€๋งŒ ์‚ดํŽด๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ํฌํŠธ ๋ฒˆํ˜ธ 3000์„ ์ง€์ •ํ•˜๊ณ , http, http-status-codes ๋ชจ๋“ˆ์„ ํ• ๋‹นํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฐ‘์— router, content-types, utils ๋ชจ๋“ˆ๋„ ํ• ๋‹นํ–ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ

 

 

์—ฌ๊ธฐ์„œ content-types ๋ž‘ utils ํŒŒ์ผ์€

content-types.js

 

utils.js

 

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜์˜€๋‹ค. ์ด ๋‘๊ฐ€์ง€ ๋ชจ๋“ˆ์€ main.js ๋‚ด์— ์žˆ๋Š” ๋ณ€์ˆ˜๋“ค์˜ ๊ตฌ์กฐํ™”๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.

content-types.js ์—์„œ๋Š” ์ฝ˜ํ…์ธ  ํƒ€์ž… ๋งคํ•‘ ๊ฐ์ฒด๋ฅผ ์ต์ŠคํฌํŠธ ํ•˜์—ฌ ํŒŒ์ผ ํƒ€์ž…์„ ๋งคํ•‘ํ•˜๊ณ , 

utils.js์—์„œ๋Š” ์ œ๊ณต๋œ ์œ„์น˜์˜ ํŒŒ์ผ์„ ์ฐพ์•„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์ฐพ๋Š” ํŒŒ์ผ์ด ์—†์œผ๋ฉด ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  router.js ํŒŒ์ผ์€ ์ด๋ ‡๊ฒŒ ์ •์˜๋œ๋‹ค.

์ด ํŒŒ์ผ์€ http-status-codes์™€ ์•ž์—์„œ ์ •์˜ํ•œ content-types, utils๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

๋จผ์ € 5ํ–‰์— ๋ณด๋ฉด routes ๊ฐ์ฒด๋ฅผ ์ •์˜ํ–ˆ๋‹ค. 

routes ๊ฐ์ฒด๋Š” ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ get ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ GET ์š”์ฒญ, post ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ POST ์š”์ฒญ์„ ๋งคํ•‘ํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  10ํ–‰์˜ handle ํ•จ์ˆ˜๋Š” main.js์—์„œ createServer์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ๊ฐ„์ฃผ๋œ๋‹ค. 

 

19ํ–‰๊ณผ 23ํ–‰์˜ get๊ณผ post ํ•จ์ˆ˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜์™€ URL์„ ์ทจํ•˜๋ฉฐ routes ๊ฐ์ฒด์—์„œ ์„œ๋กœ ๋งคํ•‘ํ•œ๋‹ค.

handle ํ•จ์ˆ˜์—์„œ try-catch ๊ตฌ๋ฌธ ์•ˆ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ผ์šฐํŠธ๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ๋‹ค๋ฉด utils ๋ชจ๋“ˆ ๋‚ด ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ getFile ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.

 

 

 

4. ๋ทฐ ํŽ˜์ด์ง€ ์ƒ์„ฑ

 

๋‚˜๋Š”

https://startbootstrap.com/themes

 

Free Bootstrap Themes & Templates - Start Bootstrap

Landing Page A clean, functional landing page theme

startbootstrap.com

์—ฌ๊ธฐ์—์„œ ๋ฌด๋ฃŒ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜์˜€๋‹ค.

์—ฌ๊ธฐ์„œ ํ…œํ”Œ๋ฆฟ์„ ๋‹ค์šด๋ฐ›๊ณ  ํ•ด๋‹น css, js, images ํŒŒ์ผ๋“ค์„ ๊ฐ€์ ธ์™€์„œ ์“ฐ๋ฉด ๋œ๋‹ค.

 

์ด๊ฑฐ๋Š” ํ•™๊ต๋‹ค๋‹๋•Œ ์›น ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๋งŽ์ด ํ–ˆ๋˜๊ฑฐ๋ผ ํŒจ์Šค.

 

๊ทผ๋ฐ ์ ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ๋ญ”๊ฐ€ ์ข€ ๋‹ฌ๋ผ์„œ ํ—ค๋งธ์—ˆ๋Š”๋ฐ ๊ทธ๊ฑด ๋‚˜์ค‘์— ๊ทธ ๋ถ€๋ถ„ ๋‚˜์˜ค๋ฉด ์ ๊ฒ ์Œ.

 

 

 

5. ๋ผ์šฐํŠธ ์ƒ์„ฑ

 

๋ผ์šฐํŠธ๋“ค์„ ํ•ธ๋“ค๋งํ•˜๊ธฐ ์œ„ํ•ด router.js ํŒŒ์ผ์€ ์ด๋ฏธ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด์ œ ์ด๊ฑธ ๋“ฑ๋ก์„ ํ•ด์•ผํ•œ๋‹ค. 

๋“ฑ๋ก์ด๋ผ๋Š” ๋ง์˜ ์˜๋ฏธ๋Š” url ๋ฐ http ๋ฉ”์†Œ๋“œ๋“ค์— ๋”ฐ๋ผ router.get, router.post ํ•จ์ˆ˜๋กœ ๋ณด๋‚ธ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

๋ผ์šฐํŠธ ๋“ฑ๋ก์„ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

  • ์š”์ฒญ์ด GET์ธ๊ฐ€ POST ์ธ๊ฐ€
  • URL ๋ผ์šฐํŠธ
  • ๋Œ๋ ค์ค„ ํŒŒ์ผ ์ด๋ฆ„
  • HTTP ์ƒํƒœ ์ฝ”๋“œ
  • ๋Œ๋ ค์ค„ ํŒŒ์ผ ํƒ€์ž… (Content Type)

 

๊ฐ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ์‘๋‹ต์„ ๋ณด๋‚ผ ์ฝ˜ํ…์ธ  ํƒ€์ž…์„ ์ง€์ •ํ•ด์•ผ ํ•˜๋ฉฐ, fs ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด ๋ทฐ ํŽ˜์ด์ง€์™€ ์—์…‹์„ ์‘๋‹ต ์ฝ˜ํ…์ธ ๋กœ ์ฝ์–ด๋“ค์—ฌ์•ผ ํ•œ๋‹ค. 

 

์ด๋ ‡๊ฒŒ ๋“ฑ๋ก, ์ •์˜ํ•œ๋‹ค.

 

์—ฌ๊ธฐ์„œ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ํŒŒ์ผ๋กœ ๋ณด์ผ ์—์…‹(์ด๋ฏธ์ง€, js, css ํŒŒ์ผ)์— ๋Œ€ํ•œ ๋ผ์šฐํŠธ๋งŒ ๋งŒ๋“ ๋‹ค.

 

์ด๋ถ€๋ถ„์ด ์ค‘์š”ํ–ˆ๋‹ค....

์•ž์—์„œ ์ข€ ํ—ค๋งธ๋‹ค๊ณ  ํ•œ๊ฒŒ ์—ฌ๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค.

 

 

index.html ํŒŒ์ผ์„ ๋ณด๋ฉด

 

์ด๋ ‡๊ฒŒ favicon์ด๋ž‘ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ์ ์šฉ์‹œํ‚ค ์œ„ํ•ด ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ๋‚˜๋Š” ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ๋ณด๊ณ  ๊ทธ๋Œ€๋กœ ์ƒ๋Œ€๊ฒฝ๋กœ๋กœ

๊ทธ๋‹ˆ๊นŒ ์—ฌ๊ธฐ์„œ ์ด html ํŒŒ์ผ์€ views ํด๋”์— ์žˆ์œผ๋‹ˆ๊นŒ ../๋กœ ์ƒ์œ„ํด๋”๋กœ ์˜ฎ๊ฒจ๊ฐ€์„œ

../public/images/favicon.ico ์ฒ˜๋Ÿผ ์ž…๋ ฅํ–ˆ์—ˆ๋Š”๋ฐ, ์‹คํ–‰์‹œํ‚ค๋ฉด ์ž๊พธ cssํŒŒ์ผ์ด ์ ์šฉ๋˜์ง€ ์•Š์•˜์—ˆ๋‹ค.

 

๊ทผ๋ฐ ์•Œ๊ณ ๋ณด๋‹ˆ ์ด๊ฒŒ ์ด์ œ ์ € main.js ํŒŒ์ผ์—์„œ router.get์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ๋“ฑ๋กํ•ด์ค˜์•ผ ํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค!

 

๊ทธ๋ž˜์„œ ์ € ์œ„์— main.js ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋ณด๋ฉด 

 

router.get("/styles.css", (req, res) => {
  res.writeHead(httpStatus.OK, contentTypes.css);
  utils.getFile("public/css/styles.css", res);
});

 

์ด๋ ‡๊ฒŒ "/styles.css"๋กœ ๊ฒฝ๋กœ๋ฅผ ๋“ฑ๋กํ•ด์ฃผ๊ณ , utils์—์„œ ํŒŒ์ผ์„ ์•Œ์•„์„œ ์ฐพ์•„์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ์Šคํƒ€์ผ์ด ๋‹ค ์ ์šฉ๋˜๊ณ  ์„œ๋ฒ„์— 

 

 

 

์ด๋ ‡๊ฒŒ ์ž˜ ๋œฌ๋‹ค ^____^

 

 

 

 

LIST

๋Œ“๊ธ€