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

Dev.log/Node.js

[Node.js ๊ต๊ณผ์„œ] #21. ์ต์Šคํ”„๋ ˆ์Šค ์›น ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ - Router ๊ฐ์ฒด๋กœ ๋ผ์šฐํŒ… ๋ถ„๋ฆฌํ•˜๊ธฐ

์ด์ „ ์˜ˆ์ œ์—์„œ ๋ผ์šฐํ„ฐ๋ฅผ ๋งŒ๋“ค ๋•Œ ์š”์ฒญ ๋ฉ”์„œ๋“œ์™€ ์ฃผ์†Œ๋ณ„๋กœ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋ฅด ํ•˜๋А๋ผ ์ฝ”๋“œ๊ฐ€ ๋งค์šฐ ๋ณต์žกํ–ˆ๋‹ค. if ๋ฌธ์œผ๋กœ ๋ถ„๊ธฐํ•˜์—ฌ ์ฝ”๋”ฉํ•˜์—ฌ ๋ณด๊ธฐ์—๋„ ์ข‹์ง€ ์•Š๊ณ  ํ™•์žฅํ•˜๊ธฐ๋„ ์–ด๋ ค์› ๋‹ค. ์ต์Šคํ”„๋ ˆ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ ๋ผ์šฐํŒ…์„ ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์  ๋•Œ๋ฌธ์ด๋‹ค.

 

app.js์˜ ๋ผ์šฐํ„ฐ ๋ถ€๋ถ„์„ ์‚ดํŽด๋ณด์ž.

 

 

์ต์Šคํ”„๋ ˆ์Šค ์•ฑ๊ณผ๋Š” app.use('/', indexRouter)์™€ app.use('/users', userRouter)๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค. app.use๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ผ์šฐํ„ฐ๋„ ์ผ์ข…์˜ ๋ฏธ๋“ค์›จ์–ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ฅธ ๋ฏธ๋“ค์›จ์–ด์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์•ž์— ์ฃผ์†Œ๊ฐ€ ๋ถ™์–ด์žˆ๋‹ค. ์ด์™€ ๊ฐ™์ด ๋ผ์šฐํŒ… ๋ฏธ๋“ค์›จ์–ด๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ฃผ์†Œ๋ฅผ ๋ฐ›์•„์„œ ํŠน์ • ์ฃผ์†Œ์— ํ•ด๋‹นํ•˜๋Š” ์š”์ฒญ์ด ์™”์„ ๋•Œ๋งŒ ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ๋™์ž‘ํ•˜๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ฃผ์†Œ๊ฐ€ /๋กœ ์‹œ์ž‘ํ•˜๋ฉด routes/index.js๋ฅผ, /users๋กœ ์‹œ์ž‘ํ•˜๋ฉด routes/users.js๋ฅผ ํ˜ธ์ถœํ•˜๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

use ๋Œ€์‹  get, post, put, patch, delete ๊ฐ™์€ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

app.use('/', function(req, res, next) {
	console.log('/ ์ฃผ์†Œ์˜ ์š”์ฒญ์ผ ๋•Œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. HTTP ๋ฉ”์„œ๋“œ๋Š” ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค.');
    next();
});

app.get('/', function(req, res, next) {
	console.log('GET ๋ฉ”์„œ๋“œ / ์ฃผ์†Œ์˜ ์š”์ฒญ์ผ ๋•Œ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.');
    next();
});

app.post('/data', function(req, res, next) {
	console.log('POST ๋ฉ”์„œ๋“œ /data ์ฃผ์†Œ์˜ ์š”์ฒญ์ผ ๋•Œ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.');
    next();
});

 

use ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋“  HTTP ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ์š”์ฒญ ์ฃผ์†Œ๋งŒ ์ผ์น˜ํ•˜๋ฉด ์‹คํ–‰๋˜์ง€๋ฐ˜, get, post, put, patch, delete ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋Š” ์ฃผ์†Œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ HTTP ๋ฉ”์„œ๋“œ๊นŒ์ง€ ์ผ์น˜ํ•˜๋Š” ์š”์ฒญ์ผ ๋•Œ๋งŒ ์‹คํ–‰๋œ๋‹ค. 

์ด์ œ ๋ผ์šฐํ„ฐ๋ฅผ ์‚ดํŽด๋ณด์ž. ๋ผ์šฐํ„ฐ ํŒŒ์ผ๋“ค์€ routes ํด๋”์— ๋“ค์–ด ์žˆ๋‹ค. index์™€ users ๋ผ์šฐํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

routes/index.js

 

routes/users.js

 

router ๊ฐ์ฒด๋Š” express.Router()๋กœ ๋งŒ๋“ค์—ˆ๋‹ค. ๋งˆ์ง€๋ง‰์—๋Š” module.exports = router;๋กœ ๋ผ์šฐํ„ฐ๋ฅผ ๋ชจ๋“ˆ๋กœ ๋งŒ๋“ ๋‹ค. router์—๋„ app์ฒ˜๋Ÿผ use, get, post, put, patch, delete ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค. use๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ฐ๊ฐ HTTP ์š”์ฒญ ๋ฉ”์„œ๋“œ์™€ ์ƒ์‘ํ•œ๋‹ค.

๋˜ํ•œ, app.use์ฒ˜๋Ÿผ router ํ•˜๋‚˜์— ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์žฅ์ฐฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์‹ค์ œ ๋ผ์šฐํ„ฐ ๋กœ์ง์ด ์‹คํ–‰๋˜๋Š” ๋ฏธ๋“ค์›จ์–ด ์ „์— ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ๋˜๋Š” ๊ด€๋ฆฌ์ž ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ค‘๊ฐ„์— ๋„ฃ์–ด๋‘๊ณค ํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

router.get('/', middleware1, middleware2, middleware3);

 

๋‹ค์‹œ ์ฝ”๋“œ ์„ค๋ช…์œผ๋กœ ๋Œ์•„๊ฐ€์„œ, router.get('/')์ด๋ฉด / ์ฃผ์†Œ๋กœ GET ์š”์ฒญ์„ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. res.render ๋ฉ”์„œ๋“œ๋กœ ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค. ์ต์Šคํ”„๋ ˆ์Šค๊ฐ€ ์‘๋‹ต ๊ฐ์ฒด์— ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ ๋ฉ”์„œ๋“œ์ด๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

users.js์—์„œ๋„ router.get('/') ๋ถ€๋ถ„์ด ์žˆ๋‹ค. app.js์—์„œ app.use('/users', usersRouter)๋กœ ์—ฐ๊ฒฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— /users์™€ /์ด ํ•ฉ์ณ์ ธ /users/๋กœ GET ์š”์ฒญ์„ ํ–ˆ์„ ๋•Œ ์ด ๋ผ์šฐํ„ฐ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค. 

์‚ฌ์‹ค ๋ผ์šฐํ„ฐ(express.Router())๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š” ์—†์ด app.js์—์„œ app.get('/', ๋ฏธ๋“ค์›จ์–ด), app.get('/users', ๋ฏธ๋“ค์›จ์–ด)๋ฅผ ํ•ด๋„ ๊ธฐ๋Šฅ์€ ๋™์ผํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ฝ”๋“œ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ผ์šฐํ„ฐ๋ฅผ ๋ณ„๋„๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ผ์šฐํ„ฐ์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋ณด๋‚ด๊ฑฐ๋‚˜ ์—๋Ÿฌ ํ•ธ๋“ค๋Ÿฌ๋กœ ์š”์ฒญ์„ ๋„˜๊ฒจ์•ผ ํ•œ๋‹ค. ์‘๋‹ต์„ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ๊ณ„์† ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ์‘๋‹ต์— ์ œํ•œ ์‹œ๊ฐ„์ด ์žˆ์œผ๋ฏ€๋กœ ์˜์›ํžˆ ๊ธฐ๋‹ค๋ฆฌ์ง€๋Š” ์•Š์ง€๋งŒ, ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค. res ๊ฐ์ฒด์— ๋“ค์–ด ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋“ค๋กœ ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค.

next ํ•จ์ˆ˜์—๋Š” ๋ผ์šฐํ„ฐ์—์„œ๋งŒ ๋™์ž‘ํ•˜๋Š” ํŠน์ˆ˜ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค. next('route')์ด๋‹ค. ๋ผ์šฐํ„ฐ์— ์—ฐ๊ฒฐ๋œ ๋‚˜๋จธ์ง€ ๋ฏธ๋“ค์›จ์–ด๋“ค์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

router.get('/', function(req, res, next) {
	next('route');
}, function(req, res, next) {
	console.log('์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.');
    next();
}, function(req, res, next) {
	console.log('์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.');
    next();
});

router.get('/', function(req, res) {
	console.log('์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.');
    res.render('index', { title: 'Express' });
});

 

๊ฐ™์€ ์ฃผ์†Œ์˜ ๋ผ์šฐํ„ฐ๋ฅผ ๋‘ ๊ฐœ ๋งŒ๋“ค์—ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ผ์šฐํ„ฐ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฏธ๋“ค์›จ์–ด์—์„œ next('route')๋ฅผ ํ˜ธ์ถœํ•˜์ž ๋‘ ๋ฒˆ์งธ, ์„ธ ๋ฒˆ์งธ ๋ฏธ๋“ค์›จ์–ด๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  ์ฃผ์†Œ์™€ ์ผ์น˜ํ•˜๋Š” ๋‹ค์Œ ๋ผ์šฐํ„ฐ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

์œ ์šฉํ•œ ํŒ์ด ํ•˜๋‚˜ ๋” ์žˆ๋‹ค. ๋ผ์šฐํ„ฐ ์ฃผ์†Œ์—๋Š” ํŠน์ˆ˜ํ•œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํŒจํ„ด์ด ์žˆ์ง€๋งŒ, ์ž์ฃผ ์“ฐ์ด๋Š” ํŒจํ„ด ํ•˜๋‚˜๋งŒ ์•Œ์•„๋ณด์ž.

 

router.get('/users/:id', function(req, res) {
	console.log(req.params, req.query);
});

 

์ฃผ์†Œ์— :id๊ฐ€ ์žˆ๋Š”๋ฐ, ๋ฌธ์ž ๊ทธ๋Œ€๋กœ :id๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์—๋Š” ๋‹ค๋ฅธ ๊ฐ’์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. /users/1์ด๋‚˜ /users/123 ๋“ฑ์˜ ์š”์ฒญ๋„ ์ด ๋ผ์šฐํ„ฐ์— ๊ฑธ๋ฆฐ๋‹ค. ์ด ๋ฐฉ์‹์˜ ์žฅ์ ์€ :id์— ํ•ด๋‹นํ•˜๋Š” 1์ด๋‚˜ 123์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. req.params ๊ฐ์ฒด ์•ˆ์— ๋“ค์–ด ์žˆ๋‹ค. :id๋ฉด req.params.id๋กœ, :type์ด๋ฉด rea.params.type์œผ๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์†Œ์— ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์„ ์“ธ ๋•Œ๋„ ์žˆ๋‹ค. ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์˜ ํ‚ค-๊ฐ’ ์ •๋ณด๋Š” req.query ๊ฐ์ฒด ์•ˆ์— ๋“ค์–ด ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, /users/123?limit=5&skip=10์ด๋ผ๋Š” ์ฃผ์†Œ์˜ ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ req.params์™€ req.query ๊ฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

{ id: '123' } { limit: '5', skip: '10' }

 

์š”์ฒญ ์ฃผ์†Œ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ์–ด ์š”๊ธดํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ, ์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์ ์ด ์žˆ๋‹ค. ์ผ๋ฐ˜ ๋ผ์šฐํ„ฐ๋ณด๋‹ค ๋’ค์— ์œ„์น˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค์–‘ํ•œ ๋ผ์šฐํ„ฐ๋ฅผ ์•„์šฐ๋ฅด๋Š” ์™€์ผ๋“œ์นด๋“œ ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ ์ผ๋ฐ˜ ๋ผ์šฐํ„ฐ๋ณด๋‹ค๋Š” ๋’ค์— ์œ„์น˜ํ•ด์•ผ ๋‹ค๋ฅธ ๋ผ์šฐํ„ฐ๋ฅผ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋Š”๋‹ค.

์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ผ์šฐํ„ฐ๋Š” ์š”์ฒญ์„ ๋ณด๋‚ธ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์„ ๋ณด๋‚ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

send๋Š” ๋งŒ๋Šฅ ๋ฉ”์„œ๋“œ์ด๋‹ค. ๋ฒ„ํผ ๋ฐ์ดํ„ฐ๋‚˜ ๋ฌธ์ž์—ด์„ ์ „์†กํ•˜๊ฑฐ๋‚˜, HTML ์ฝ”๋“œ๋ฅผ ์ „์†กํ•˜๊ธฐ๋„ ํ•˜๊ณ , JSON ๋ฐ์ดํ„ฐ๋„ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค. sendFile์€ ํŒŒ์ผ์„ ์‘๋‹ต์œผ๋กœ ๋ณด๋‚ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ๊ณ , json์€ JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ค€๋‹ค. redirect๋Š” ์‘๋‹ต์„ ๋‹ค๋ฅธ ๋ผ์šฐํ„ฐ๋กœ ๋ณด๋‚ด๋ฒ„๋ฆฐ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๊ทธ์ธ ์™„๋ฃŒ ํ›„ ๋‹ค์‹œ ๋ฉ”์ธ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„๊ฐˆ ๋•Œ res.redirect(๋ฉ”์ธ ํ™”๋ฉด ์ฃผ์†Œ)๋ฅผ ํ•˜๋ฉด ๋œ๋‹ค.

 

res.send(๋ฒ„ํผ ๋˜๋Š” ๋ฌธ์ž์—ด ๋˜๋Š” HTML ๋˜๋Š” JSON);
res.sendFile(ํŒŒ์ผ ๊ฒฝ๋กœ);
res.json(JSON ๋ฐ์ดํ„ฐ);
res.redirect(์ฃผ์†Œ);
res.render('ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ ๊ฒฝ๋กœ', { ๋ณ€์ˆ˜ });

 

๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” 200 HTTP ์ƒํƒœ ๋ณด๋“œ๋ฅผ ์‘๋‹ตํ•˜์ง€๋งŒ (res.redirect๋Š” 302), ์ง์ ‘ ๋ฐ”๊ฟ”์ค„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด status ๋ฉ”์„œ๋“œ๋ฅผ ๋จผ์ € ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

res.status(404).send('Not Found');

 

render ๋ฉ”์„œ๋“œ๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ๋ Œ๋”๋งํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. views ํด๋” ์•ˆ pug ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํŒŒ์ผ๋“ค์ด ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ผ์šฐํ„ฐ๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•  ๋•Œ ์–ด๋–ค ์ผ๋“ค์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž. ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์šฐํ„ฐ๊ฐ€ ์—†๋‹ค๋ฉด ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๋กœ ๋„˜์–ด๊ฐ„๋‹ค. 404 HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ณด๋‚ด์ฃผ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด์—์„œ ์ƒˆ๋กœ์šด ์—๋Ÿฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์—๋Ÿฌ์˜ ์ƒํƒœ์ฝ”๋“œ๋ฅผ 404๋กœ ์„ค์ •ํ•œ ๋’ค ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด๋กœ ๋„˜๊ฒจ ๋ฒ„๋ฆฐ๋‹ค.

 

...
//404 ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด
app.use(function(req, res, next) {
	next(createError(404));
});

// ์—๋Ÿฌ ํ•ธ๋“ค๋Ÿฌ
app.use(function(err, req, res, next) {
	// set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};
    
    // render the error page
    res.status(err.status || 500);
    res.render('error');
});
...l