ํ ํ๋ฆฟ ์์ง ์ฌ์ฉํ๊ธฐ
HTML์ ์ ์ ์ธ ์ธ์ด์ด๋ค. ์ฃผ์ด์ง ๊ธฐ๋ฅ๋ง ์ฌ์ฉํ ์ ์๊ณ , ์ฌ์ฉ์๊ฐ ๊ธฐ๋ฅ์ ์ง์ ์ถ๊ฐํ ์ ์๋ค. ๋ฌผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์์ ๋์ ์ด์ผ๊ธฐ์ด๋ค.
HTML๋ก 1000๊ฐ๋ ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ํํํ๊ณ ์ถ๋ค๋ฉด ์ผ์ผ์ด ์ง์ ์ฝ๋ฉํด์ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ก ํํํ๋ฉด ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค. ํ ํ๋ฆฟ ์์ง์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํด์ HTML์ ๋ ๋๋งํ ์ ์๊ฒ ํด์ค๋ค. ๋ฐ๋ผ์ ๊ธฐ์กด HTML๊ณผ๋ ๋ฌธ๋ฒ์ด ์ด์ง ๋ค๋ฅผ ์ ์๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ด ๋ค์ด ์๊ธฐ๋ ํ๋ค.
๋ํ์ ์ธ ํ ํ๋ฆฟ ์์ง์ธ Pug์ EJS์ ๋ํด ์ดํด๋ณด์.
1. Pug(Jade)
์์ ์ด๋ฆ์ธ Jade๋ก ๋ ์ ๋ช ํ Pug๋ ๊พธ์คํ ์ธ๊ธฐ๋ฅผ ์ป๊ณ ์๋ค. ๋ฌธ๋ฒ์ด ๊ฐ๋จํ์ฌ ์ฝ๋์ ์์ด ์ค์ด๋ค๊ธฐ ๋๋ฌธ์ด๋ค. Ruby๋ฅผ ์ฌ์ฉํด ๋ณด์๋ค๋ฉด ๋ฌธ๋ฒ์ด ๋น์ทํด ๊ธ๋ฐฉ ์ ์ํ ๊ฒ์ด๋ค. ๋ฌผ๋ก Ruby๋ฅผ ๋ชจ๋ฅด๋ ์ฌ๋๋ ๋ฌธ๋ฒ์ด ์ฌ์์ ๋น ๋ฅด๊ฒ ๋ฐฐ์ธ ์ ์๋ค. ๋จ, HTML๊ณผ๋ ๋ฌธ๋ฒ์ด ๋ง์ด ๋ฌ๋ผ ํธ๋ถํธ๊ฐ ๊ฐ๋ฆฐ๋ค.
๋จผ์ app.js์ ๋ค์ ๋ถ๋ถ์ด ๋ค์ด ์์ด์ผ ํ๋ค.

views๋ ํ ํ๋ฆฟ ํ์ผ๋ค์ด ์์นํ ํด๋๋ฅผ ์ง์ ํ๋ ๊ฒ์ด๋ค. res.render ๋ฉ์๋๊ฐ ์ด ํด๋ ๊ธฐ์ค์ผ๋ก ํ ํ๋ฆฟ ์์ง์ ์ฐพ์์ ๋ ๋๋งํ๋ค. res.render('index')๋ผ๋ฉด views/index.pug๋ฅผ ๋ ๋๋งํ๋ค. res.render('admin/main')๋ผ๋ฉด views/admin/main.pug๋ฅผ ๋ ๋๋งํ๋ค.
view engine์ ์ด๋ ํ ์ข ๋ฅ์ ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ ์ง๋ฅผ ๋ํ๋ธ๋ค. ํ์ฌ pug๋ก ์ฒใ ๋์ด ์์ผ๋ฏ๋ก ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด ๋๋ค.
1.1 HTML ํํ
๊ธฐ์กด HTML๊ณผ ๋ค๋ฅด๊ฒ ํ์ด๊ดํธ(<>)์ ๋ซ๋ ํ๊ทธ๊ฐ ์๋ค. ํญ ๋๋ ์คํ์ด์ค๋ก๋ง ํ๊ทธ์ ๋ถ๋ชจ ์์ ๊ด๊ณ๋ฅผ ๊ท๋ช ํ๋ค. ํญ ํ ๋ฒ, ์คํ์ด์ค ๋ ๋ฒ ๋๋ ์คํ์ด์ค ๋ค ๋ฒ ๋ชจ๋ ์๊ด ์๋ค. ๋ชจ๋ ํ์ผ์ ๋์ผํ ์ข ๋ฅ์ ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ์ ์ฉํ๋ฉด ๋๋ค. ์์ ํ๊ทธ๋ ๋ถ๋ชจ ํ๊ทธ๋ณด๋ค ๋ค์ฌ์ฐ๊ธฐ ๋์ด ์์ด์ผ ํ๋ค. ๋ค์ฌ์ฐ๊ธฐ์ ์ค๋ฅ๊ฐ ์์ผ๋ฉด ์ ๋๋ก ๋ ๋๋ง๋์ง ์์ผ๋ ์ฃผ์ํด์ผ ํ๋ค.
doctype html์ <!DOCTYPE html>๊ณผ ๊ฐ๋ค. html, head, title ํ๊ทธ์์๋ ์์ ํ๊ทธ์ผ์๋ก ํ ๋จ๊ณ์ฉ ๋ ๋ค์ฌ์ฐ๊ธฐ ๋์ด ์๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
ํ์ด๊ดํธ๊ฐ ์์ผ๋ฏ๋ก ํ๊ทธ์ ์์ฑ๋ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ํํํ๋ค. ํ๊ทธ๋ช ๋ค์ ์๊ดํธ๋ก ๋ฌถ์ด ์ ์ด์ค๋ค.

์์ฑ ์ค ์์ด๋์ ํด๋์ค๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์๋ค. div ํ๊ทธ์ธ ๊ฒฝ์ฐ div ๋ฌธ์๋ ์๋ตํ ์ ์๋ค.

HTML ํ ์คํธ๋ ๋ค์๊ณผ ๊ฐ์ด ํ๊ทธ ๋๋ ์์ฑ ๋ค์ ํ ์นธ์ ๋๊ณ ์ ๋ ฅํ๋ฉด ๋๋ค.

์๋ํฐ์์ ํ ์คํธ๋ฅผ ์ฌ๋ฌ ์ค ์ ๋ ฅํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์ดํ(|)๋ฅผ ๋ฃ์ด์ค๋ค. HTML ์ฝ๋์์๋ ํ ์ค๋ก ๋์จ๋ค.

1.2 ๋ณ์
HTML๊ณผ ๋ค๋ฅด๊ฒ ์๋ฐ์คํฌ๋ฆฝํธ ๋ณ์๋ฅผ ํ ํ๋ฆฟ์ ๋ ๋๋งํ ์ ์๋ค. res.render ํธ์ถ ์ ๋ณด๋ด๋ ๋ณ์๋ฅผ Pug๊ฐ ์ฒ๋ฆฌํด์ค๋ค. routes/index.js์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ค์ ๋ถ๋ถ์ด ์๋ค.

res.render(ํ ํ๋ฆฟ, ๋ณ์ ๊ฐ์ฒด)๋ ์ต์คํ๋ ์ค๊ฐ res ๊ฐ์ฒด์ ์ถ๊ฐํ ํ ํ๋ฆฟ ๋ ๋๋ง์ ์ํ ๋ฉ์๋์ด๋ค. index.pug๋ฅผ HTML๋ก ๋ ๋๋งํ๋ฉด์ { title: 'Express' }๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ณ์๋ก ์ง์ด๋ฃ๋๋ค. layout.pug์ index.pug์ title ๋ถ๋ถ์ด ๋ชจ๋ Express๋ก ์นํ๋๋ค. ์ฆ, HTML์๋ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ ์ ์ด๋ค.
res.render ๋ฉ์๋์ ๋ ๋ฒ์งธ ์ธ์๋ก ๋ณ์ ๊ฐ์ฒด๋ฅผ ๋ฃ๋ ๋์ , app.js์ ์๋ฌ ์ฒ๋ฆฌ ๋ฏธ๋ค์จ์ด์ฒ๋ผ res.locals ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ๋ณ์๋ฅผ ๋ฃ์ ์๋ ์๋ค.

์์ ๊ฐ์ด ํ๋ฉด ํ ํ๋ฆฟ ์์ง์ด res.locals ๊ฐ์ฒด๋ฅผ ์ฝ์ด์ ๋ณ์๋ฅผ ์ง์ด ๋ฃ๋๋ค. ์ด ๋ฐฉ์์ ์ฅ์ ์ ํ์ฌ ๋ผ์ฐํฐ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋ฏธ๋ค์จ์ด์์๋ res.locals ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ๋ฏธ๋ค์จ์ด์์ ํ ํ๋ฆฟ ์์ง์ฉ ๋ณ์๋ฅผ ๋ฏธ๋ฆฌ ๋ฃ์ ์๋ ์๋ค.
Pug์์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์.

์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๋ณ์๋ ๋ค์ํ ๋ฐฉ์์ผ๋ก Pug์์ ์ฌ์ฉํ ์ ์๋ค. ๋ณ์๋ฅผ ํ ์คํธ๋ก ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ํ๊ทธ ๋ค์ =๋ฅผ ๋ถ์ธ ํ ๋ณ์๋ฅผ ์ ๋ ฅํ๋ค. ์์ฑ์๋ =๋ฅผ ๋ถ์ธ ํ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ํ ์คํธ ์ค๊ฐ์ ๋ณ์๋ฅผ ๋ฃ์ผ๋ ค๋ฉด #{๋ณ์}๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ๋ณ์๊ฐ ๊ทธ ์๋ฆฌ์ ๋ค์ด๊ฐ๋ค. #{}์ ๋ด๋ถ์ =๊ธฐํธ ๋ท๋ถ๋ถ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ํด์ํ๋ฏ๋ก input ํ๊ทธ์ ๊ฒฝ์ฐ์ฒ๋ผ ์๋ฐ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ์ ์จ๋ ๋๋ค.
์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ๋ก ๋ด๋ ค๋ณด๋ผ ๋ #{}์ =๋ฅผ ๋งค์ฐ ๋น๋ฒํ๊ฒ ์ฌ์ฉํ๋ ๊ผญ ๊ธฐ์ตํด๋๊ธฐ๋ฅผ ๋ฐ๋๋ค.
๋ด๋ถ์ ์ง์ ๋ณ์๋ฅผ ์ ์ธํ ์๋ ์๋ค. ๋นผ๊ธฐ(-)๋ฅผ ๋จผ์ ์ ๋ ฅํจ๋ ๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ์ ์์ฑํ ์ ์๋ค. ์ฌ๊ธฐ์ ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ๋ค์ ์ค๋ถํฐ ํด๋น ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.

Pug๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณ์์ ํน์๋ฌธ์๋ฅผ HTML ์ํฐํฐ๋ก ์ด์ค์ผ์ดํํ๋ค. ์ด์ค์ผ์ดํ๋ฅผ ์ํ์ง ์๋๋ค๋ฉด = ๋์ !=๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.

1.3 ๋ฐ๋ณต๋ฌธ
HTML๊ณผ ๋ค๋ฅด๊ฒ ๋ฐ๋ณต๋ฌธ๋ ์ฌ์ฉํ ์ ์๋ค. ๋ฐ๋ณต ๊ฐ๋ฅํ ๋ณ์์ธ ๊ฒฝ์ฐ์ผ ๋๋ง ํด๋น๋๋ค. ๋ค์๊ณผ ๊ฐ์ด each๋ก ๋ฐ๋ณต๋ฌธ์ ๋๋ฆด ์ ์๋ค. each ๋์ for๋ฅผ ์จ๋ ๋๋ค.

๋ฐ๋ณต๋ฌธ ์ฌ์ฉ ์ ์ธ๋ฑ์ค๋ ๊ฐ์ ธ์ฌ ์ ์๋ค.

1.4 ์กฐ๊ฑด๋ฌธ
์กฐ๊ฑด๋ฌธ์ผ๋ก ํธ๋ฆฌํ๊ฒ ๋ถ๊ธฐ ์ฒ๋ฆฌํ ์ ์๋ค. if, else if, else๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋ค์์ isLoggedIn ๋ณ์๋ก ๋ก๊ทธ์ธ ์ฌ๋ถ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ HTML์ ๋ ๋๋งํ๋ ์์์ด๋ค.

case๋ฌธ๋ ๊ฐ๋ฅํ๋ค.

1.5 include
๋ค๋ฅธ Pug๋ HTML ํ์ผ์ ๋ฃ์ ์ ์๋ค.
ํค๋๋ ํธํฐ, ๋ด๋น๊ฒ์ด์ ์ฒ๋ผ ์น ์ ์ ์ ๊ณตํต๋๋ ๋ถ๋ถ์ ๋ฐ๋ก ๊ด๋ฆฌํ ์ ์์ด ๋งค ํ์ด์ง๋ง๋ค ๋์ผํ HTML์ ๋ฃ์ด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ ์์ ์ค๋ค.


1.6 extends์ block
๋ ์ด์์์ ์ ํ ์ ์๋ค. ๊ณตํต๋๋ ๋ ์ด์์ ๋ถ๋ถ์ ๋ฐ๋ก ๊ด๋ฆฌํ ์ ์์ด ์ข๋ค. include์๋ ํจ๊ป ์ฌ์ฉํ๊ณค ํ๋ค.


๋ ์ด์์์ด ๋ ํ์ผ์๋ ๊ณตํต๋ ๋งํฌ์ ์ ๋ฃ๋, ํ์ด์ง๋ง๋ค ๋ฌ๋ผ์ง๋ ๋ถ๋ถ์ block์ผ๋ก ๋น์๋๋ค. block์ ์ฌ๋ฌ ๊ฐ ๋ง๋ค์ด๋ ๋๋ค. block์ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ block [๋ธ๋ก๋ช ]์ด๋ค.
block์ด ๋๋ ํ์ผ์์๋ extends ํค์๋๋ก ๋ ์ด์์ ํ์ผ์ ์ง์ ํ๊ณ block ๋ถ๋ถ์ ๋ฃ์ด์ค๋ค. block ์ ์ธ๋ณด๋ค ํ ๋จ๊ณ ๋ ๋ค์ฌ์ฐ๊ธฐ ๋์ด ์์ด์ผ ํ๋ค. ๋์ค์ ์ต์คํ๋ ์ค์์ res, render('body')๋ฅผ ์ฌ์ฉํด ํ๋์ HTML๋ก ํฉ์ณ ๋ ๋๋งํ ์ ์๋ค. Pug ํ์ฅ์๋ ์๋ต ๊ฐ๋ฅํ๋ค. block ๋ถ๋ถ์ด ์๋ก ํฉ์ณ์ง๋ค.
์ด์ Pug์ ๋ฌธ๋ฒ์ ์ถฉ๋ถํ ๋ฐฐ์ ์ผ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ๋ Pug ํ์ผ๋ค์ ์ดํด๋ณด์.



index.pug๋ฅผ ๋ณด๋ฉด extends layout๊ณผ block content๊ฐ ์๋ค. layout.pug์ block content ๋ถ๋ถ์ index.pug์ block content๋ฅผ ๋ฃ๋๋ค. index.pug๋ title์ด๋ผ๋ ๋ณ์๋ฅผ ๋ฐ์ ๋ ๋๋งํ๋ค.
error.pug๋ block content ๋ถ๋ถ์ด layout.pug์ ์ฐ๊ฒฐ๋๋ค. ๋ผ์ฐํฐ๋ก๋ถํฐ message์ error ๋ณ์๋ฅผ ๋ฐ์ ๋ ๋๋งํ๋ค.
2. EJS
EJS๋ Pug์ HTML ๋ฌธ๋ฒ ๋ณํ์ ์ ์ํ๊ธฐ ํ๋ ๋ถ์ ์ํ ํ ํ๋ฆฟ ์์ง์ด๋ค. HTML ๋ฌธ๋ฒ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ์ถ๊ฐ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค. ์๋ฐ์ JSP์ ๋ฌธ๋ฒ์ด ์๋นํ ์ ์ฌํ๋ค.
app.js์์ view engine์ pug ๋์ ejs๋ก ๋ฐ๊ฟ์ค๋ค.

ejs ํจํค์ง๋ ๋ค์๊ณผ ๊ฐ์ด ์ค์นํด์ผ ํ๋ค.

์ด์ EJS์ ๋ฌธ๋ฒ์ ๋ฐฐ์๋ณด์.
2.1 ๋ณ์
EJS์์ ๋ณ์๋ <%= %>๋ก ๊ฐ์ผ๋ค.

๋ด๋ถ์ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ <% %> ์์ ์ ์ด์ค๋ค.

HTML์ ์ด์ค์ผ์ดํํ๊ณ ์ถ์ง ์๋ค๋ฉด <%- %>๋ก ๊ฐ์ธ์ค๋ค.

2.2 ๋ฐ๋ณต๋ฌธ
EJS์์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ <% %> ์์ ์ด๋ค. ๋ฐ๋ผ์ ๋ฐ๋ณต๋ฌธ๋ ์ด ์์ ์ฐ๋ฉด ๋๋ค. Pug์ฒ๋ผ ๋ฐ๋ก ๋ฌธ๋ฒ์ด ์๋ ๊ฒ์ ์๋๊ณ , for๋ while ๊ฐ์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ฉด ๋๋ค.


2.3 ์กฐ๊ฑด๋ฌธ
์กฐ๊ฑด๋ฌธ๋ <% %> ์์ ์ด๋ค.

case๋ฌธ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.

2.4 include
HTML ํ์ผ์ ํฌํจํ๋ ค๋ฉด <%- include(ํ์ผ ๊ฒฝ๋ก, ๋ฐ์ดํฐ) %>๋ฅผ ํ๋ฉด ๋๋ค.


์์ฝ๊ฒ๋ EJS๋ Pug์ layout๊ณผ block์ ์ง์ํ์ง ์๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด express-ejs-layouts ํจํค์ง๋ฅผ ์ค์นํด์ผ ํ๋ค.
Express-generator๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑํ Pug ํ์ผ์ EJS๋ก ๋ฐ๊พธ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.


head ํ๊ทธ ๊ฐ์ด ์ค๋ณต๋๋ ๋ถ๋ถ์ ๋์ค์ ๋ณ๋์ ํ์ผ๋ก ๋ถ๋ฆฌํ์ฌ include๋ก ๋ฃ์ผ๋ฉด ๋๋ค.
Pug์ EJS ์ค ์ทจํฅ์ ๋ง๋ ํ ํ๋ฆฟ์ผ๋ก ์งํํ๋ฉด ๋๋ค. ๋ณดํต HTML์์ ํฌ๊ฒ ๋ฒ์ด๋๊ณ ์ถ์ง ์๋ค๋ฉด EJS๋ฅผ, ๊น๋ํ ๋ฌธ๋ฒ์ ์ํ๋ค๋ฉด Pug๋ฅผ ์ฌ์ฉํ๋ค.
Pug์ EJS ์ธ์๋ Nunjucks, Hogan, Dust, Twig, Vash ๋ฑ์ ํ ํ๋ฆฟ ์์ง์ด ์๋ค. ํ์ง๋ง ๋ฌธ๋ฒ๋ง ๋ค๋ฅด๊ณ ํต์ฌ ๊ธฐ๋ฅ์ ๋ค ๋น์ทํ๋ค. ๋ค๋ฅธ ๊ฒ๋ ์ดํด๋ณธ ํ ์ทจํฅ์ ๋ง๋ ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ๋ฉด ๋๋ค.
3. ์๋ฌ ์ฒ๋ฆฌ ๋ฏธ๋ค์จ์ด
์ง๊ธ๊น์ง ํ ํ๋ฆฟ ์์ง์ ๋ํด ์ดํด๋ณด์๋ค. ์ด์ ์๋ฌ ์ฒ๋ฆฌ ๋ฏธ๋ค์จ์ด์ ์ฝ๋๊ฐ ์ด๋ค ๊ธฐ๋ฅ์ ํ๋์ง ๋ณด์ผ ๊ฒ์ด๋ค.

์๋ฌ ์ฒ๋ฆฌ ๋ฏธ๋ค์จ์ด๋ error๋ผ๋ ํ ํ๋ฆฟ ํ์ผ์ ๋ ๋๋งํ๋ค. ๋ ๋๋ง ์ res.locals.message์ res.locals.error์ ๋ฃ์ด์ค ๊ฐ์ ํจ๊ป ๋ ๋๋งํ๋ค. res.render์ ๋ณ์๋ฅผ ๋์ ํ๋ ๊ฒ ์ธ์๋, ์ด๋ ๊ฒ res.locals ์์ฑ์ ๊ฐ์ ๋์ ํ์ฌ ํ ํ๋ฆฟ ์์ง์ ๋ณ์๋ฅผ ์ฃผ์ ํ ์ ์๋ค.
error ๊ฐ์ฒด๋ ์์คํ ํ๊ฒฝ์ด development(๊ฐ๋ฐ ํ๊ฒฝ)๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ํ์๋๋ค. ๋ฐฐํฌ ํ๊ฒฝ์ธ ๊ฒฝ์ฐ์๋ ์๋ฌ ๋ฉ์์ง๊ฐ ํ์๋์ง ์๋๋ค. ์๋ฌ ๋ฉ์์ง๊ฐ ๋ ธ์ถ๋๋ฉด ๋ณด์์ ์ทจ์ฝํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฝ๋ ์ค์ req.app.get(ํค)๋ผ๋ ๊ฒ์ด ์๋ค. req.app์ ํตํด์ app ๊ฐ์ฒด์ ์ ๊ทผํ๋ ๊ฒ์ด๋ค. app.get(ํค)๊ฐ app.set(ํค)๋ก ์ค์ ํ๋ ๊ฒ์ ๊ฐ์ ธ์ค๋ ์ฝ๋์ด๋ฏ๋ก req.app.get(ํค)๋ก๋ ๊ฐ๋ฅํ๋ค. ์๋ฅผ ๋ค์ด, app.set('view engine', 'pug')๋ฅผ ํ๋ค๋ฉด app.get('view engine')์ผ๋ก pugใน๋ ๊ฐ์ ๊ฐ์ ธ์ฌ ์๋ ์๋ค. ๋ผ์ฐํฐ์์๋ req.app.get('view engine')์ผ๋ก ๊ฐ์ ธ์จ๋ค.

๋ง์ฝ 404 ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ฉด message๋ Not Found๊ฐ ๋๋ค. 404 ์ฒ๋ฆฌ ๋ฏธ๋ค์จ์ด์์ ๋ฃ์ด์ค ๊ฐ์ ์ฌ์ฉํ๋ค. error.status๋ 404๊ฐ ๋๊ณ , error.stack์ ์๋ฌ์ ๊ดํ ์์ธํ ๋ฉ์์ง๊ฐ ํ์๋๋ค. ๋ฐฐํฌ ํ๊ฒฝ์์๋ error ๋ถ๋ถ์ด ๋ ๋๋ง๋์ง ์์ ๊ฒ์ด๋ค.