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

Node.js - 13 Express.js๋ฅผ ํ†ตํ•œ ์‚ฌ์ดํŠธ ๊ฐœ์„ 

by hanwitjus 2021. 10. 27.

๊ทธ ์ „์— ๊ทธ๋ƒฅ node.js๋ž‘ router, utils๋งŒ ๊ฐ€์ง€๊ณ  ๊ตฌํ˜„ํ•ด๋†จ๋˜ Confetti Cuisine ์บก์Šคํ†ค ํ”„๋กœ์ ํŠธ๋ฅผ

express.js๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ์ ํŠธ๋กœ ๋ฐ”๊ฟ”๋ดค๋‹ค.

 

๋จผ์ € ์ตœ์ข… ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐ๋Š” ์ด๋ ‡๊ฒŒ ๋œ๋‹ค.

 

 

 

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

 

์—ฌํƒœ ํ•ด์™”๋˜ ๊ฒƒ๊ณผ ๊ฐ™์ด npm init ๋ช…๋ น์œผ๋กœ package.json์„ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.

์‹œ์ž‘ ํฌ์ธํŠธ๋Š” main.js ๋กœ ํ•œ๋‹ค.

 

npm install ๋ช…๋ น์–ด๋กœ express, ejs, express-ejs-layouts, http-status-codes ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

 

๊ทธ๋ ‡๊ฒŒ ์™„์„ฑ๋œ package.json ํŒŒ์ผ์„ ์—ด์–ด์„œ script์˜์—ญ์—

"start": "node main.js"๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

์ตœ์ข…์ ์œผ๋กœ package.json ํŒŒ์ผ์€

 

์ด๋Ÿฐ ๋ชจ์–‘์ด ๋œ๋‹ค.

 

๋ˆˆ์—ฌ๊ฒจ ๋ด์•ผํ•  ๋ถ€๋ถ„์—๋งŒ ๋นจ๊ฐ•์ƒ‰์œผ๋กœ ํ‘œ์‹œํ–ˆ๋‹ค.

 

์™œ์ธ์ง„ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, http-status-codes ํŒจํ‚ค์ง€๋ฅผ ์—ฐ์† ๋‘๋ฒˆ ์„ค์น˜ํ–ˆ๋”๋‹ˆ ๋ฒ„์ „์ด ๋‹ค๋ฅธ ๋‘๊ฐœ๊ฐ€ ์„ค์น˜๋๊ณ , 

layouts๋„ express-ejs-layouts์„ ์„ค์น˜ํ•ด์•ผ ๋˜๋Š”๋ฐ ๊ทธ๋ƒฅ layouts์„ ์„ค์น˜ํ•ด์„œ ์ €๋ ‡๊ฒŒ ๋๋‹ค..^^

 

์•”ํŠผ ์ด๋ ‡๊ฒŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™”๋ฅผ ๋งˆ์ณค๋‹ค.

 

 

 

2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ œ์ž‘

 

์ด์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ดˆ๊ธฐํ™”๋ฅผ ๊ฑฐ์ณ์„œ Express.js ๋ฒ„์ „์œผ๋กœ ์ค€๋น„๊ฐ€ ๋๊ณ ,

main.js ํŒŒ์ผ์„ ๋งŒ๋“ค ์ฐจ๋ก€๋‹ค.

 

 

๋จผ์ € ์ด๋ ‡๊ฒŒ ํ•„์š”ํ•œ ์ƒ์ˆ˜๋“ค์„ ๋ชจ์กฐ๋ฆฌ ์ •์˜ํ•œ๋‹ค.

port ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๊ณ , http, http-status-codes, content-types(์‚ฌ์‹ค ํ•„์š”์—†์Œ), express, express-ejs-layouts ํŒจํ‚ค์ง€๋“ค์„ ๊ฐ€์ ธ์˜ค๊ณ ,

์„ ์–ธํ•œ homeController, errorController๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  app ์ƒ์ˆ˜๋ฅผ express ๊ฐ์ฒด๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  ์ด์ œ app ์„ธํŒ…์„ ํ•œ๋‹ค.

(12ํ–‰์€ ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ์Œ ๊ฑ ํŒŒ๋ผ๋ฏธํ„ฐ ์˜ค๊ณ ๊ฐ€๋Š” post ์š”์ฒญ ๋ฐ›์•„๋“ค์ผ ์„ธํŒ…์ธ๊ฐ....?)

 

ejs๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด view engine์„ ์„ธํŒ…ํ•˜๊ณ , layouts ์‚ฌ์šฉ์„ ์„ธํŒ…ํ•˜๊ณ , ์—์…‹ ์‚ฌ์šฉ์„ ์œ„ํ•œ static ํ•จ์ˆ˜๋„ ์„ธํŒ…ํ•œ๋‹ค.

 

** ์—ฌ๊ธฐ์„œ static ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฏธ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์ ์–ด ๋†“๋Š”๊ฒŒ ์ข‹์€ ์ ์ด, ์—์…‹๋“ค์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ์˜ˆ์ „์ฒ˜๋Ÿผ

 app.get("/scripts.js", (req, res) => {
  res.writeHead(httpStatus.OK, contentTypes.js);
  utils.getFile("public/js/scripts.js", res);
 });

์ด๋ ‡๊ฒŒ ๋ผ์šฐํ„ฐ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ์ ์–ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ–ˆ๋‹ค. (router.js, utils.js ํŒŒ์ผ๋“ค๋„ ํ•„์š”ํ–ˆ์Œ)

๊ทผ๋ฐ

app.use(express.static("public"));

์ €๊ฑฐ ํ•œ ์ค„๋งŒ ์ ์–ด๋†“์œผ๋ฉด html ํŒŒ์ผ ํ˜น์€ ejs ํŒŒ์ผ์—์„œ ์ € ๊ฒฝ๋กœ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ƒ๋Œ€๊ฒฝ๋กœ๋งŒ ์ ์œผ๋ฉด ๋ชจ๋“  ์—์…‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  17ํ–‰~23ํ–‰์—์„œ ๋ณด์ด๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ์œ ์ž… ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•  ์ค€๋น„๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด body-parser๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. 

์ด๊ฒƒ์€ URL ์ธ์ฝ”๋“œ์™€ JSON ํŒŒ๋ผ๋ฏธํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ์ด๋‹ค.

 

 

 

3. ๋ผ์šฐํŠธ์˜ ์ถ”๊ฐ€

 

์ €๊ธฐ๊นŒ์ง€ ๋‹ค ํ–ˆ์œผ๋ฉด ์ด์ œ ํŽ˜์ด์ง€๋ฅผ ์™”๋‹ค ๊ฐ”๋‹ค ํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์šฐํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

๋จผ์ € ๊ทธ ์ „์— ๊ทธ ๊ณผ์ •์„ ์ฒ˜๋ฆฌํ•ด์ค„ controller๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

 

homeController.js

 

์ด๊ฑด homeController.js์ด๋‹ค. ์š”์ฒญ๋œ ๋ผ์šฐํŠธ์— ejs ํŒŒ์ผ์„ ์ด์šฉํ•ด ์‘๋‹ตํ•œ๋‹ค.

 

์ฒซ๋ฒˆ์งธ  showIndex๋ผ๋Š” ํ•จ์ˆ˜๋Š” ์ฑ…์—๋Š” ์—†๋Š”๋ฐ ํ™ˆํ™”๋ฉด์œผ๋กœ ๊ฐˆ ๋•Œ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์•„์„œ ๊ทธ๋ƒฅ ๋‚ด๊ฐ€ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‘๋ฒˆ์งธ showCourses ํ•จ์ˆ˜์—์„œ ejs ํŒŒ์ผ์— courses๋ผ๋Š” ๊ฐ์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•จ๊ป˜ ์ „๋‹ฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ €๋ ‡๊ฒŒ ์„ ์–ธํ–ˆ๋‹ค.

 

 

๊ทธ๋‹ค์Œ์€ errorController์ด๋‹ค.

 

errorController.js

 

404 ์—๋Ÿฌ์™€ 500์—๋Ÿฌ์— ๋Œ€๋น„ํ•˜๋Š” ํ•จ์ˆ˜๋“ค์„ ์ •์˜ํ–ˆ๋‹ค.

404 ์—๋Ÿฌ์ผ ๋•Œ๋Š” error์ฝ”๋“œ์™€ ํ•จ๊ป˜ error.ejs ๋ทฐ ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

 

 

 

4. ๋ทฐ๋กœ ๋ผ์šฐํŒ… (๋ ˆ์ด์•„์›ƒ ์‚ฌ์šฉ)

 

ํ˜„์žฌ๊นŒ์ง€ ์ด ์บก์Šคํ†ค ์›น์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•„์š”ํ•œ view์˜ ๋ชฉ๋ก์€ ์ด๋ ‡๋‹ค. (์ฑ… ์ฐธ๊ณ ํ•จ)

 

ํŒŒ์ผ๋ช… ๋ชฉ์ 
layouts.ejs ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”์ธ ์Šคํƒ€์ผ๋ง๊ณผ ๊ธฐ๋ณธ ํƒ์ƒ‰ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰
index.ejs ํ™ˆํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ ๋ฅผ ๋งŒ๋“ค์–ด๋ƒ„
courses.ejs ์ฝ”์Šค ์ฝ˜ํ…์ธ ์˜ ๋””์Šคํ”Œ๋ ˆ์ด
contact.ejs ์—ฐ๋ฝ์ฒ˜ ์–‘์‹์˜ ๋””์Šคํ”Œ๋ ˆ์ด
thanks.ejs ์–‘์‹ ์ œ์ถœ ํ›„ ๊ฐ์‚ฌ ๋ฉ”์‹œ์ง€ ๋””์Šคํ”Œ๋ ˆ์ด
error.ejs ํŽ˜์ด์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋””์Šคํ”Œ๋ ˆ์ด

 

๊ทธ๋ž˜์„œ ์ด 6๊ฐ€์ง€์˜ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

๋จผ์ € ํ—ค๋”๋ž‘ Navigation bar, Footer ๋ถ€๋ถ„์ด ๋Š˜ ๋ฐ˜๋ณต๋˜๋Š”๋ฐ ์ด์ œ ๊ทธ๊ฑธ layouts์„ ์ด์šฉํ•˜๋ฉด ๊น”๋”ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

layout.ejs

 

์ด๋ ‡๊ฒŒ layout์„ ์ •์˜ํ•ด๋†“์œผ๋ฉด ์ƒˆ๋กœ์šด ๋ทฐ๊ฐ€ ๋ Œ๋”๋ง ๋์„ ๋•Œ layout.ejs ํŒŒ์ผ์„ ๊ฑฐ์ณ์„œ <%- body%> ๋ถ€๋ถ„์ด ๋ Œ๋”๋ง ๋œ ํƒ€๊ฒŸ ์ฝ˜ํ…์ธ ๋กœ ๋Œ€์ฒด ๋œ๋‹ค.

 

 

๊ทธ๋Ÿผ ๋‹ค๋ฅธ ๋ทฐํŒŒ์ผ๋“ค์€

 

contact.ejs

์ด๋ ‡๊ฒŒ body์•ˆ์˜ ๋‚ด์šฉ, ๋‚ด์šฉ์ด ๋ฐ”๋€Œ๋Š” section ๋ถ€๋ถ„๋งŒ ์ ์–ด๋†“์œผ๋ฉด ๋œ๋‹ค.

 

 

 

5. ๋ทฐ์— ์ฝ˜ํ…์ธ  ์ „๋‹ฌ

 

๋‚˜์ค‘์— DB๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋“ค์–ด์˜ฌ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋น„์Šทํ•˜๊ฒŒ forEach๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ด์„œ ๋ทฐ์— ์ถœ๋ ฅํ•˜๋Š” ๊ฑธ ํ•ด๋ดค๋‹ค.

 

๋จผ์ € ์ผ๋‹จ DB๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ถœ๋ ฅํ•  ์ฝ˜ํ…์ธ ๋“ค์„ homeController ์•ˆ์—์„œ ๋ฐฐ์—ด ๊ฐ์ฒด๋ฅผ ์ž„์˜๋กœ ์ƒ์„ฑํ–ˆ๋‹ค.

๋‚˜์ค‘์—๋Š” ์ปจํŠธ๋กค๋Ÿฌ์—์„œ DB์— ์ ‘๊ทผํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ ๊ฐ™๋‹ค.

 

 

์ด๋ ‡๊ฒŒ ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ์š”์†Œ๊ฐ€ title, cost๋ฅผ ๊ฐ–๊ฒŒ courses๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฐฐ์—ด ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  "/courses" ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜ showCourses ํ•จ์ˆ˜์—

res.render("course", {offeredCourses : courses});

์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ offeredCourses ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ทฐ์— ์ „๋‹ฌํ•œ๋‹ค.

 

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ทฐ์—์„œ offeredCourses๋กœ ๋ฐฐ์—ด์— ์ ‘๊ทผํ•˜์—ฌ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

์ด๋ ‡๊ฒŒ

 

 

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Express.js ์›น ํ”„๋ ˆ์ž„ ๊ธฐ๋ฐ˜์œผ๋กœ ์บก์Šคํ†ค ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฑด ๋์ด ๋‚œ๋‹ค.

 

๊ทธ๋ž˜์„œ ์™„์„ฑ๋œ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ทฐ๋Š” ์ด๋ ‡๋‹ค.

 

 

home ํ™”๋ฉด (index.ejs)

 

courses๋ฅผ ๋ฐฐ์—ด๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด ์ถœ๋ ฅํ•œ๊ฒƒ (course.ejs)

 

contact.ejs

 

404 error ํ™”๋ฉด

 

 

 

LIST

๋Œ“๊ธ€