์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[๋…ธ๋“œ 2ํŒ€] #7. ์ต์Šคํ”„๋ ˆ์Šค ์›น ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ

24-25/Node.js 2

by sksmsyena 2024. 11. 22. 10:00

๋ณธ๋ฌธ

728x90

 

๐ŸŒŸํ‚ค์›Œ๋“œ: ์ต์Šคํ”„๋ ˆ์Šค, ๋ฏธ๋“ค์›จ์–ด, ๋ผ์šฐํŒ… ๋ถ„๋ฆฌ, rep์™€ res ๊ฐ์ฒด, ํ…œํ”Œ๋ฆฟ ์—”์ง„

 


1. ์ต์Šคํ”„๋ ˆ์Šค ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ํ•˜๊ธฐ

- ์ต์Šคํ”„๋ ˆ์Šค: http ๋ชจ๋“ˆ์˜ ์š”์ฒญ๊ณผ ์‘๋‹ต ๊ฐ์ฒด์— ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๋ถ€์—ฌํ–ˆ๋‹ค.

 

1. pakage.json ์ƒ์„ฑ

โ‘  learn-express ํด๋”๋ฅผ ๋งŒ๋“ ๋‹ค.

โ‘ก ํ•ญ์ƒ package.json์„ ์ œ์ผ ๋จผ์ € ์ƒ์„ฑํ•œ๋‹ค.

- npm init ๋ช…๋ น์–ด๋กœ ๋‹จ๊ณ„์ ์œผ๋กœ ๋‚ด์šฉ๋ฌผ์„ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜

- npm init -y๋ฅผ ์ž…๋ ฅํ•ด ํŒŒ์ผ์„ ๋งŒ๋“  ๋’ค ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•œ๋‹ค.

โ‘ข versoin, descripition, author, license๋Š” ์ž์œ ๋กœ์ด ์ˆ˜์ •ํ•œ๋‹ค.

 

package.json

{
	"name": "learn-express",
    "version":"0.0.1",
    "description":"์ต์Šคํ”„๋ ˆ์Šค๋ฅผ ๋ฐฐ์šฐ์ž",
    "main":"app.js",
    "scripts":{
    	"start":"nodemon app" //app.js๋ฅผ nodemon์œผ๋กœ ์‹คํ–‰
    },
    author: "ZeroCho",
    "license": "MIT"
}

 

์ฝ˜์†”

$ npm i express
$ npm i -D nodemon

 

- script์˜ start๋Š” ๊ผญ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค.

- nodemon ๋ชจ๋“ˆ: ์„œ๋ฒ„๋ฅผ ์ž๋™์œผ๋กœ ์žฌ์‹œ์ž‘

 → nodemon์ด ์„œ๋ฒ„๋ฅผ ์ž๋™์œผ๋กœ ์žฌ์‹œ์ž‘+์‹คํ–‰๋˜๋Š” ์ฝ˜์†”์— rs๋ฅผ ์ž…๋ ฅํ•ด ์ˆ˜๋™์œผ๋กœ ์žฌ์‹œ์ž‘ ๊ฐ€๋Šฅ

- nodemon์€ ๊ฐœ๋ฐœ์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉ ๊ถŒ์žฅ

 

2. app.js ์ƒ์„ฑ

app.js

const express = require('express');

const app = express(); //Express ๋ชจ๋“ˆ์„ ์‹คํ–‰ํ•ด app ๋ณ€์ˆ˜์— ํ• ๋‹น 
app.set('port', process.env.PORT || 3000); // ์„œ๋ฒ„๋กœ ์‹คํ–‰๋  ํฌํŠธ๋ฅผ ์„ค์ •

app.get('/', (req, res) => { //GET ์š”์ฒญ์‹œ ์–ด๋–ค ๋™์ž‘์„ ํ• ์ง€
  res.send('Hello, Express');
});

app.listen(app.get('port'), () => { //http ์›น ์„œ๋ฒ„์™€ ๋™์ผ, ํฌํŠธ ์—ฐ๊ฒฐ ํ›„ ์„œ๋ฒ„ ์‹คํ–‰
  console.log(app.get('port'), '๋ฒˆ ํฌํŠธ์—์„œ ๋Œ€๊ธฐ ์ค‘'); // app.get('port')๋กœ ํฌํŠธ๋ฅผ ๊ฐ€์ ธ์˜ด
});

โ‘  Express ๋ชจ๋“ˆ์„ ์‹คํ–‰ํ•ด app ๋ณ€์ˆ˜์— ํ• ๋‹น

- Express ๋‚ด๋ถ€์— http ๋ชจ๋“ˆ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ๋‹ค. → ์„œ๋ฒ„์˜ ์—ญํ•   ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ

 

โ‘ก app.set('port', ํฌํŠธ): ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋  ํฌํŠธ ์„ค์ •

-  process.env ๊ฐ์ฒด์— PORT ์†์„ฑ์ด ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’์„, ์—†๋‹ค๋ฉด ๊ธฐ๋ณธ 3000 ํฌํŠธ ์ด์šฉ

 

โ‘ข app.get(์ฃผ์†Œ, ๋ผ์šฐํ„ฐ)

-  GET ์š”์ฒญ ์‹œ ์–ด๋–ค ๋™์ž‘์„ ํ• ์ง€

-  req=์š”์ฒญ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๊ฐ์ฒด, res=์‘๋‹ต์— ๊ด€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๊ฐ์ฒด

- GET ์š”์ฒญ ์™ธ์—๋„ POST, PUT, PATCH, DELETE, OPTIONS์— ๋Œ€ํ•œ ๋ผ์šฐํ„ฐ๋ฅผ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 

โ‘ฃ listen์„ ํ•˜๋Š” ๋ถ€๋ถ„์€ http ์›น ์„œ๋ฒ„์™€ ๋™์ผ

 

์ฝ˜์†”

$ npm start

> learn-express@0.0.1 start
> nodemon app

[nodemon] 2.0.16
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node app.js`
3000 ๋ฒˆ ํฌํŠธ์—์„œ ๋Œ€๊ธฐ ์ค‘

 

→ http://localhost:3000์œผ๋กœ ์ ‘์†ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŽ˜์ด์ง€๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

 

โ€ป HTML๋กœ ์‘๋‹ตํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ path ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด ์ง€์ •ํ•œ ๋’ค res.senFile ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

2. ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด

- ๋ฏธ๋“ค์›จ์–ด(middleware): ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ์ค‘๊ฐ„์— ์œ„์น˜ํ•˜๋Š” ์ต์Šคํ”„๋ ˆ์Šค์˜ ํ•ต์‹ฌ

- ๋ฏธ๋“ค์›จ์–ด๋Š” ์œ„์—์„œ๋ถ€ํ„ฐ ์•„๋ž˜๋กœ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋œ๋‹ค.

- ๋ฏธ๋“ค์›จ์–ด๋Š” ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์กฐ์ž‘ํ•ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋„ ํ•˜๊ณ , ๋‚˜์œ ์š”์ฒญ์„ ๊ฑธ๋Ÿฌ๋‚ด๊ธฐ๋„ ํ•œ๋‹ค.

 

1. ์ต์Šคํ”„๋ ˆ์Šค ์„œ๋ฒ„์— ๋ฏธ๋“ค์›จ์–ด ์—ฐ๊ฒฐ 

app.js

app.set('port', process.env.PORT || 3000);

app.use((req, res, next) => { //app.use(๋ฏธ๋“ค์›จ์–ด) ๊ผด๋กœ ์‚ฌ์šฉ
  console.log('๋ชจ๋“  ์š”์ฒญ์— ๋‹ค ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.');
  next();
});
app.get('/', (req, res, next) => { 
  console.log('GET / ์š”์ฒญ์—์„œ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.');
  next();
}, (req, res) => {  
  throw new Error('์—๋Ÿฌ๋Š” ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด๋กœ ๊ฐ‘๋‹ˆ๋‹ค.')
});

app.use((err, req, res, next) => { //์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด
  console.error(err);
  res.status(500).send(err.message);
});

app.listen(app.get('port'), () => {
...

 

โ‘  app.use(๋ฏธ๋“ค์›จ์–ด) ๊ผด๋กœ ์‚ฌ์šฉ

- app.use์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ req, res, next์ธ ํ•จ์ˆ˜๋ฅผ ๋„ฃ๋Š”๋‹ค.

- next๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

- ์ฃผ์†Œ๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ชจ๋“  ์š”์ฒญ์—์„œ ์‹คํ–‰๋œ๋‹ค.

 

โ‘ก ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด

- ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด๋Š” err, req, res, next๋กœ ๋„ค ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๋Š”๋‹ค.

- ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ฐ˜๋“œ์‹œ ๋„ค ๊ฐœ์—ฌ์•ผ ํ•œ๋‹ค.

- res.status๋กœ HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์ง€์ •, ๊ธฐ๋ณธ๊ฐ’์€ 200 (์„ฑ๊ณต)

- ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ง์ ‘ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š์•„๋„ ์ต์Šคํ”„๋ ˆ์Šค๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ, ์‹ค๋ฌด์—์„œ๋Š” ์ง์ ‘ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

2. ์‹ค๋ฌด์—์„œ ๋งŽ์ด ์“ฐ์ด๋Š” ํŒจํ‚ค์ง€ ์„ค์น˜

์ฝ˜์†”

$ npm i morgan cookie-parser express-session dotenv

 

app.js

const express = require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');

dotenv.config();
const app = express();
app.set('port', process.env.PORT || 3000);

app.use(morgan('dev'));
app.use('/', express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
  resave: false,
  saveUninitialized: false,
  secret: process.env.COOKIE_SECRET,
  cookie: {
    httpOnly: true,
    secure: false,
  },
  name: 'session-cookie',
}));
app.use((req, res, next) => {
  console.log('๋ชจ๋“  ์š”์ฒญ์— ๋‹ค ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.');
  next();
});
...

.env

COOKIE_SECRET=cookiesecret

 

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฑ… ์ฐธ์กฐ...

 

3. ๊ฐ๊ฐ์˜ ๋ฏธ๋“ค์›จ์–ด ์‚ดํŽด๋ณด๊ธฐ

โ‘  morgan: ์—ฐ๊ฒฐ ํ›„ localhost:3000์— ๋‹ค์‹œ ์ ‘์†ํ•˜๋ฉด ์ถ”๊ฐ€์ ์ธ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

app.use(morgan('dev' | 'combined' | 'short' | 'tiny')); // ๊ด„ํ˜ธ ์† ํ•˜๋‚˜์˜ ์š”์†Œ๋งŒ ์ž‘์„ฑ

 

โ‘ก static: ์ •์ ์ธ ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๋Š” ๋ผ์šฐํ„ฐ ์—ญํ• ์„ ํ•œ๋‹ค.

app.use('์š”์ฒญ ๊ฒฝ๋กœ', express.static('์‹ค์ œ ๊ฒฝ๋กœ'));

 

โ‘ข body-parser: ์š”์ฒญ์˜ ๋ณธ๋ฌธ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์„ํ•ด req.body ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

app.use(express.json());

app.use(express.urlenconded({extended: false}));

 

โ‘ฃ cookie-parser: ์š”์ฒญ์— ๋™๋ด‰๋œ ์ฟ ํ‚ค๋ฅผ ํ•ด์„ํ•ด req.cookies ๊ฐ์ฒด๋กœ ๋งŒ๋“ ๋‹ค.

app.use(cookieParser(๋น„๋ฐ€ ํ‚ค));

 

โ‘ค express-session: ์„ธ์…˜๊ด€๋ฆฌ์šฉ ๋ฏธ๋“ค์›จ์–ด, ์„ธ์…˜ ๊ตฌํ˜„์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ์ €์žฅํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

 

โ‘ฅ ๋ฏธ๋“ค์›จ์–ด์˜ ํŠน์„ฑ ํ™œ์šฉํ•˜๊ธฐ

(1) rep, res, next๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ–๋Š” ํ•จ์ˆ˜๋กœ app.use, app.post๋“ฑ์œผ๋กœ ์žฅ์ฐฉํ•œ๋‹ค. 

(2) ํŠน์ • ์ฃผ์†Œ์˜ ์š”์ฒญ์—๋งŒ ์‹คํ–‰๋˜๊ฒŒ ํ•˜๋ ค๋ฉด ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ฃผ์†Œ๋ฅผ ๋„ฃ๋Š”๋‹ค. 

(3) ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์žฅ์ฐฉํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๋กœ ๋„˜์–ด๊ฐ€๋ ค๋ฉด next ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

 

โ€ป ๋ฏธ๋“ค์›จ์–ด ์žฅ์ฐฉ ์ˆœ์„œ์— ๋”ฐ๋ผ ์–ด๋–ค ๋ฏธ๋“ค์›จ์–ด๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.

โ€ป next(err)๋ฅผ ํ†ตํ•ด ๋ผ์šฐํ„ฐ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด๋กœ ๋„˜๊ธด๋‹ค. 

 

โ‘ฆ ๋ฏธ๋“ค์›จ์–ด ์‚ฌ์šฉ ์‹œ ์œ ์šฉํ•œ ํŒจํ„ด: ๋ฏธ๋“ค์›จ์–ด ์•ˆ์— ๋ฏธ๋“ค์›จ์–ด ๋„ฃ๊ธฐ

app.use(morgan('dev'));
// ๋˜๋Š”
app.use((req, res, next) => {
  morgan('dev')(req, res, next);
});

- ๊ธฐ์กด ๋ฏธ๋“ค์›จ์–ด์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. (ex) ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ

 

โ‘ง multer: ์ด๋ฏธ์ง€, ๋™์˜์ƒ ๋“ฑ์„ ๋น„๋กฏํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํŒŒ์ผ์„ ๋ฉ€ํ‹ฐํŒŒํŠธ ํ˜•์‹์œผ๋กœ ์—…๋กœ๋“œ ์‹œ ์‚ฌ์šฉํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด

const multer = require('multer');

const upload = multer({
  storage: multer.diskStorage({ //storage: ์–ด๋””์—(destination), ์–ด๋–ค ์ด๋ฆ„์œผ๋กœ(filename) ์ €์žฅํ• ์ง€
    destination(req, file, done) { //req: ์š”์ฒญ์— ๋Œ€ํ•œ ์ •๋ณด, file: ์—…๋กœ๋“œํ•œ ํŒŒ์ผ์˜ ์ •๋ณด, done: ํ•จ์ˆ˜
      done(null, 'uploads/'); 
    },
    filename(req, file, done) { //req: ์š”์ฒญ์— ๋Œ€ํ•œ ์ •๋ณด, file: ์—…๋กœ๋“œํ•œ ํŒŒ์ผ์˜ ์ •๋ณด, done: ํ•จ์ˆ˜
      const ext = path.extname(file.originalname);
      done(null, path.basename(file.originalname, ext) + Date.now() + ext); //Date.now(): ํŒŒ์ผ๋ช…์˜ ์ค‘๋ณต ๋ฐฉ์ง€
    },
  }),
  limits: { fileSize: 5 * 1024 * 1024 }, //์—…๋กœ๋“œ์— ๋Œ€ํ•œ ์ œํ•œ ์‚ฌํ•ญ ์„ค์ •: fileSize๋Š” 5MB
});

- uploads ํด๋”๊ฐ€ ์„œ๋ฒ„์— ๊ผญ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค. 

- upload ๋ณ€์ˆ˜๊ฐ€ ์ƒ๊ธด ๋’ค, ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 single ๋ฏธ๋“ค์›จ์–ด: ํ•˜๋‚˜์˜ ํŒŒ์ผ๋งŒ ์—…๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ

 array ๋ฏธ๋“ค์›จ์–ด: ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ

 fileds ๋ฏธ๋“ค์›จ์–ด: ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜์ง€๋งŒ, input ํƒœ๊ทธ๋‚˜ ํผ ๋ฐ์ดํ„ฐ์˜ ํ‚ค๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ

 none ๋ฏธ๋“ค์›จ์–ด: ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฉ€ํ‹ฐํŒŒํŠธ ํ˜•์‹์œผ๋กœ ์—…๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ

 

 

3. Router ๊ฐ์ฒด๋กœ ๋ผ์šฐํŒ… ๋ถ„๋ฆฌํ•˜๊ธฐ

- ๋ผ์šฐํ„ฐ๋ฅผ ๋งŽ์ด ์—ฐ๊ฒฐํ•˜๋ฉด app.js ์ฝ”๋“œ๊ฐ€ ๋งค์šฐ ๊ธธ์–ด์ง„๋‹ค.

→ ์ต์Šคํ”„๋ ˆ์Šค์—์„œ ๋ผ์šฐํ„ฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

 

1. app.use๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ

- routes ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์— index.js์™€ user.js๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

routes/index.js

const express = require('express');

const router = express.Router();

// GET / ๋ผ์šฐํ„ฐ
router.get('/', (req, res) => {
  res.send('Hello, Express');
});

module.exports = router;

 

routes/user.js

const express = require('express');

const router = express.Router();

// GET /user ๋ผ์šฐํ„ฐ
router.get('/', (req, res) => {
  res.send('Hello, User');
});

module.exports = router;

 

- app.use๋ฅผ ์ด์šฉํ•ด index.js์™€ user.js๋ฅผ app.js์— ์—ฐ๊ฒฐํ•œ๋‹ค.

app.js

...
const path = require('path');

dotenv.config();
const indexRouter = require('./routes'); //index.js๋Š” ์ƒ๋žต ๊ฐ€๋Šฅ 
const userRouter = require('./routes/user'); //user.js๋Š” ๋‹ค๋ฅธ ์ฃผ์†Œ์˜ ๋ผ์šฐํ„ฐ ์—ญํ•  
...
  name: 'session-cookie',
}));

app.use('/', indexRouter); //index.js ์—ฐ๊ฒฐ
app.use('/user', userRouter); //user.js ์—ฐ๊ฒฐ

app.use((req, res, next) => {
  res.status(404).send('Not Found');
}); //์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด ์œ„์— 404 ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์‘๋‹ตํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด ์ถ”๊ฐ€

app.use((err, req, res, next) => { //์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด
...

 

2. next('route')

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

router.get('/', (req, res, next) => {
  next('route'); // ๋‘, ์„ธ๋ฒˆ์งธ ๋ฏธ๋“ค์›จ์–ด๋Š” ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , ์ฃผ์†Œ์™€ ์ผ์น˜ํ•˜๋Š” ๋‹ค์Œ ๋ผ์šฐํ„ฐ๋กœ ์ด๋™
}, (req, res, next) => {
  console.log('์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค');
  next();
}, (req, res, next) => {
  console.log('์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค');
  next();
});
router.get('/', (req, res) => {
  console.log('์‹คํ–‰๋ฉ๋‹ˆ๋‹ค');
  res.send('Hello, Express');
});

- ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ผ์šฐํ„ฐ๊ฐ€ ์žˆ์–ด๋„ next()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์‹คํ–‰๋œ๋‹ค. 

 

3. ๋ผ์šฐํŠธ ๋งค๊ฐœ๋ณ€์ˆ˜ ํŒจํ„ด

router.get('/user/:id', (req, res) => {
  console.log(req.params, req.query);
});

โ˜… ๋‹ค์–‘ํ•œ ๋ผ์šฐํ„ฐ๋ฅผ ์•„์šฐ๋ฅด๋Š” ์™€์ผ๋“œ์นด๋“œ ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ ์ผ๋ฐ˜ ๋ผ์šฐํ„ฐ๋ณด๋‹ค ๋’ค์— ์œ„์น˜ํ•ด์•ผ ํ•œ๋‹ค.

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

 

 

4. req, res ๊ฐ์ฒด ์‚ดํŽด๋ณด๊ธฐ

- ์ต์Šคํ”„๋ ˆ์Šค์˜ req, res ๊ฐ์ฒด๋Š” http ๋ชจ๋“ˆ์˜ req, res ๊ฐ์ฒด๋ฅผ ํ™•์žฅํ•œ ๊ฒƒ

→ http ๋ชจ๋“ˆ์˜ ๋ฉ”์„œ๋“œ์™€ ์ต์Šคํ”„๋ ˆ์Šค๊ฐ€ ์ถ”๊ฐ€ํ•œ ๋ฉ”์„œ๋“œ๋‚˜ ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

- ์ž์ฃผ ์“ฐ์ด๋Š” rep ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ 

 req.app: req ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด app ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. req.app.get('port')์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 req.body: body-parser ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ๋งŒ๋“œ๋Š” ์š”์ฒญ์˜ ๋ณธ๋ฌธ์„ ํ•ด์„ํ•œ ๊ฐ์ฒด์ด๋‹ค.

 req.cookies: cookie-parser ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ๋งŒ๋“œ๋Š” ์š”์ฒญ์˜ ์ฟ ํ‚ค๋ฅผ ํ•ด์„ํ•œ ๊ฐ์ฒด์ด๋‹ค.

 req.ip: ์š”์ฒญ์˜ ip ์ฃผ์†Œ๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋‹ค.

 req.params: ๋ผ์šฐํŠธ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ๊ฐ์ฒด์ด๋‹ค.

 req.query: ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ๊ฐ์ฒด์ด๋‹ค.

 req.signedCookies: ์„œ๋ช…๋œ ์ฟ ํ‚ค๋“ค์€ req.cookies ๋Œ€์‹  ์—ฌ๊ธฐ์— ๋‹ด๊ฒจ์žˆ๋‹ค.

 req.get(ํ—ค๋” ์ด๋ฆ„): ํ—ค๋”์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

 

- ์ž์ฃผ ์“ฐ์ด๋Š” res ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ 

 res.app: res ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด app ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 res.cookie(ํ‚ค, ๊ฐ’, ์˜ต์…˜): ์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

 res.clearCookie(ํ‚ค, ๊ฐ’, ์˜ต์…˜): ์ฟ ํ‚ค๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

 res.end(): ๋ฐ์ดํ„ฐ ์—†์ด ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค.

 res.json(JSON): JSON ํ˜•์‹์˜ ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค.

 res.locals: ํ•˜๋‚˜์˜ ์š”์ฒญ ์•ˆ์—์„œ ๋ฏธ๋“ค์›จ์–ด ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

 res.redirect(์ฃผ์†Œ): ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ•  ์ฃผ์†Œ์™€ ํ•จ๊ป˜ ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค.

 res.render(๋ทฐ, ๋ฐ์ดํ„ฐ): ๋‹ค์Œ ์ ˆ์—์„œ ๋‹ค๋ฃฐ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ๋ Œ๋”๋ง ํ•ด์„œ ์‘๋‹ตํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

 res.send(๋ฐ์ดํ„ฐ): ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์‘๋‹ต์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ๋ฌธ์ž์—ด์ผ ์ˆ˜๋„, HTML์ผ ์ˆ˜๋„, ๋ฒ„ํผ์ผ ์ˆ˜๋„, ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

 res.sendFile(๊ฒฝ๋กœ): ๊ฒฝ๋กœ์— ์œ„์น˜ํ•œ ํŒŒ์ผ์„ ์‘๋‹ตํ•œ๋‹ค.

 res.set(ํ—ค๋”, ๊ฐ’): ์‘๋‹ต์˜ ํ—ค๋”๋ฅผ ์„ค์ •ํ•œ๋‹ค.

 res.status(์ฝ”๋“œ): ์‘๋‹ต ์‹œ์˜ HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์ง€์ •ํ•œ๋‹ค.

5. ํ…œํ”Œ๋ฆฟ ์—”์ง„ ์‚ฌ์šฉํ•˜๊ธฐ

- ํ…œํ”Œ๋ฆฟ ์—”์ง„: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด HTML์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

 

1. ํผ๊ทธ(์ œ์ด๋“œ)

โ‘  HTML๊ณผ ํผ๊ทธ์˜ ์ฐจ์ด์ 

- ํ™”์‚ด๊ด„ํ˜ธ(<>) ์™€ ๋‹ซ๋Š” ํƒœ๊ทธ๊ฐ€ ์—†๋‹ค.

- ํƒญ ๋˜๋Š” ์ŠคํŽ˜์ด์Šค๋กœ๋งŒ ํƒœ๊ทธ์˜ ๋ถ€๋ชจ ์ž์‹ ๊ด€๊ณ„๋ฅผ ๊ทœ๋ช…ํ•œ๋‹ค.

- ํƒœ๊ทธ๋ช… ๋’ค์— ์†Œ๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด ์ ๋Š”๋‹ค.

- div ๋ฌธ์ž๋Š” ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค.

- HTML ํ…์ŠคํŠธ๋Š” ํƒœ๊ทธ ๋˜๋Š” ์†์„ฑ ๋’ค์— ํ•œ ์นธ์„ ๋„๊ณ  ์ž…๋ ฅํ•œ๋‹ค.

- ์—ฌ๋Ÿฌ ์ค„์˜ ํ…์ŠคํŠธ ์ž…๋ ฅ ์‹œ ํŒŒ์ดํ”„ (|)๋ฅผ ๋„ฃ๋Š”๋‹ค.

- style, script ํƒœ๊ทธ๋Š” ํƒœ๊ทธ ๋’ค์— ์ (.)์„ ๋ถ™์ธ๋‹ค. 

ํผ๊ทธ HTML
doctype html
html
    head
        title=title;
        link(rel='stylesheet', href='/stylesheets/style.css')
<!DOCTYPE html>
<html>
    <head>
        <title>์ต์Šคํ”„๋ ˆ์Šค</title>
        <link rel="stylesheet" href="/style.css" />
    </head>
</html>
#login-button
.post-image
<div id="logint-button"></div>
<div class="post-image"></div>
p Welcome to Express


  | ์•ˆ๋…•ํ•˜์„ธ์š”
  | ์—ฌ๋Ÿฌ ์ค„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค
  br
  | ํƒœ๊ทธ๋„ ์ค‘๊ฐ„์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
<p> Welcome to Express </p>

<p>
  ์•ˆ๋…•ํ•˜์„ธ์š”. ์—ฌ๋Ÿฌ ์ค„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  <br />
  ํƒœ๊ทธ๋„ ์ค‘๊ฐ„์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
</p>
style.
  h1{...}

script.
 ...
<style>
  h1{...}
</style>

<script>
  ...
</script>

 

 

โ‘ก ๋ณ€์ˆ˜

- HTML๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜๋ฅผ ํ…œํ”Œ๋ฆฟ์— ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

- res.render(ํ…œํ”Œ๋ฆฟ, ๋ณ€์ˆ˜ ๊ฐ์ฒด): ์ต์Šคํ”„๋ ˆ์Šค๊ฐ€ res ๊ฐ์ฒด์— ์ถ”๊ฐ€ํ•œ ํ…œํ”Œ๋ฆฟ ๋ Œ๋”๋ง์„ ์œ„ํ•œ ๋ฉ”์„œ๋“œ

router.get('/', (req, res, next) => {
  res.locals.title = 'Express';
  res.render('index');
});

- res.render์˜ ๋ณ€์ˆ˜ ๊ฐ์ฒด์— res.locals ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์œผ๋ฉด ๋‹ค๋ฅธ ๋ฏธ๋“ค์›จ์–ด์—์„œ๋„ ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

→ ๋‹ค๋ฅธ ๋ฏธ๋“ค์›จ์–ด์—์„œ ํ…œํ”Œ๋ฆฟ ์—”์ง„์šฉ ๋ณ€์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

 

- ํ…์ŠคํŠธ ์ค‘๊ฐ„์— ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์œผ๋ ค๋ฉด #{๋ณ€์ˆ˜}๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

- ํผ๊ทธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ HTML ์—”ํ‹ฐํ‹ฐ๋กœ ์ด์Šค์ผ€์ดํ”„ ํ•˜๋ฏ€๋กœ, ์ด์Šค์ผ€์ดํ”„๋ฅผ ์›ํ•˜์ง€ ์•Š์œผ๋ฉด !=์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

โ‘ข ๋ฐ˜๋ณต๋ฌธ

- ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , each์™€ for๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

 

โ‘ฃ ์กฐ๊ฑด๋ฌธ

- ์กฐ๊ฑด๋ฌธ์œผ๋กœ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ณ , if, else if, else์™€ case๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โ‘ค include

- ๋‹ค๋ฅธ ํผ๊ทธ๋‚˜ HTML ํŒŒ์ผ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

- ์›น ์ œ์ž‘ ์‹œ ๊ณตํ†ต๋˜๋Š” ๋ถ€๋ถ„์„ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ํŽ˜์ด์ง€๋งˆ๋‹ค ๋™์ผํ•œ HTML์„ ๋„ฃ์–ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์—†์•ค๋‹ค.

- include ํŒŒ์ผ ๊ฒฝ๋กœ์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. 

 

โ‘ฅ extends์™€ block

- ๋ ˆ์ด์•„์›ƒ์„ ์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ณตํ†ต๋˜๋Š” ๋ ˆ์ด์•„์›ƒ ๋ถ€๋ถ„์„ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

- block์œผ๋กœ ํŽ˜์ด์ง€๋งˆ๋‹ค ๋‹ฌ๋ผ์ง€๋Š” ๋ถ€๋ถ„์„ ๋น„์›Œ๋‘”๋‹ค. 

 

2. ๋„Œ์ ์Šค

- HTML ๋ฌธ๋ฒ•์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋˜, ์ถ”๊ฐ€๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

โ‘  ๋ณ€์ˆ˜

- ๋ณ€์ˆ˜๋Š” { { } }๋กœ ๊ฐ์‹ผ๋‹ค. (ex) { {title} }

- ๋‚ด๋ถ€์— ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด { %set ๋ณ€์ˆ˜= '๊ฐ’' %}์„ ์‚ฌ์šฉํ•œ๋‹ค

- ์ด์Šค์ผ€์ดํ”„ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด { {๋ณ€์ˆ˜| safe} }๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

 

โ‘ก ๋ฐ˜๋ณต๋ฌธ

- ํŠน์ˆ˜ํ•œ ๋ฌธ์„ {% %} ์•ˆ์— ์“ฐ๋ฏ€๋กœ ๋ฐ˜๋ณต๋ฌธ๋„ ์ด ์•ˆ์— ์“ด๋‹ค.

- for in๋ฌธ๊ณผ endfor ์‚ฌ์ด์— ์œ„์น˜ํ•œ๋‹ค.

...
{% for item in fruits %}
<li>{{item}}</li>
{%endfor}
...

- loop.index๋ผ๋Š” ํŠน์ˆ˜ํ•œ ๋ณ€์ˆ˜๋กœ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

...
{% for item in fruits %}
<li>{{loop.index}}๋ฒˆ์งธ {{item}}</li>
{%endfor}
...

 

โ‘ข ์กฐ๊ฑด๋ฌธ

- {% if ๋ณ€์ˆ˜ %} {% elif %} {% else %} {% endif %}๋กœ ์ด๋ค„์ ธ ์žˆ๋‹ค.

- case๋ฌธ์€ ์—†์ง€๋งŒ elif๋ฅผ ํ†ตํ•ด ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

- { { } } ์•ˆ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.

<div>{{'์ฐธ' if isLoggedIn}}</div>
<div>{{'์ฐธ' if isLoggedIn else '๊ฑฐ์ง“'}}</div>

 

โ‘ฃ include

- ๋‹ค๋ฅธ ํผ๊ทธ๋‚˜ HTML ํŒŒ์ผ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

- ์›น ์ œ์ž‘ ์‹œ ๊ณตํ†ต๋˜๋Š” ๋ถ€๋ถ„์„ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ํŽ˜์ด์ง€๋งˆ๋‹ค ๋™์ผํ•œ HTML์„ ๋„ฃ์–ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์—†์•ค๋‹ค.

- include ํŒŒ์ผ ๊ฒฝ๋กœ์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. 

 

โ‘ค extends์™€ block

- ๋ ˆ์ด์•„์›ƒ์„ ์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ณตํ†ต๋˜๋Š” ๋ ˆ์ด์•„์›ƒ ๋ถ€๋ถ„์„ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

- block์œผ๋กœ ํŽ˜์ด์ง€๋งˆ๋‹ค ๋‹ฌ๋ผ์ง€๋Š” ๋ถ€๋ถ„์„ ๋น„์›Œ๋‘”๋‹ค. 

- {% block [๋ธ”๋ก๋ช…] %}์œผ๋กœ ์„ ์–ธํ•œ๋‹ค.

- {% endblock %}๋กœ ๋ธ”๋ก์„ ์ข…๋ฃŒํ•œ๋‹ค. 

 

3. ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด

app.js

...
app.use((req, res, next) => {
  const error =  new Error(`${req.method} ${req.url} ๋ผ์šฐํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.`); 
  error.status = 404;
  next(error);
});

app.use((err, req, res, next) => {
  res.locals.message = err.message; 
  //404 ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ res.locals.message๋Š” '${req.method} ${req.url} ๋ผ์šฐํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค'๊ฐ€ ๋œ๋‹ค.
  res.locals.error = process.env.NODE_ENV !== 'production' ? err : {};
  res.status(err.status || 500);
  res.render('error');
});
...

 

- error ๊ฐ์ฒด์˜ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋Š” ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์ด ๋ฐฐํฌํ™˜๊ฒฝ(production)์ด ์•„๋‹Œ ๊ฒฝ์šฐ ํ‘œ์‹œ๋˜๊ณ , ๋ฐฐํฌ ํ™˜๊ฒฝ์ธ ๊ฒฝ์šฐ ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋งŒ ํ‘œ์‹œ๋œ๋‹ค.

- ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„ ํด๋” ๊ตฌ์กฐ๋ฅผ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ๋Š” ์ˆจ๊ธด๋‹ค.

 

6. ํ•จ๊ป˜ ๋ณด๋ฉด ์ข‹์€ ์ž๋ฃŒ

 Express ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€: http://expressjs.com

 ํผ๊ทธ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€: https://pugjs.org

 ๋„Œ์ ์Šค ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€: https://mozilla.github.io/nunjucks

 morgan: https://github.com/expressjs/morgan

 body-parser: https://github.com/expressjs/body-parser

 cookie-parser: https://github.com/expressjs/cookie-parser

 static: https://github.com/expressjs/serve-static

 express-session: https://github.com/expressjs/session

 multer: https://github.com/expressjs/multer

 dotenv: https://github.com/motdotla/dotenv

 

 


quiz

1. http ๋ชจ๋“ˆ์˜ ์š”์ฒญ๊ณผ ์‘๋‹ต ๊ฐ์ฒด์— ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๋ถ€์—ฌํ•œ ๊ฒƒ์€ (     )๋ผ ํ•œ๋‹ค.  

2. ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ์ค‘๊ฐ„์— ์œ„์น˜ํ•˜๋Š” ์ต์Šคํ”„๋ ˆ์Šค์˜ ํ•ต์‹ฌ์„ (    )๋ผ ํ•œ๋‹ค.

3. ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด๋Š” (    ), (    ), (    ), (    )๋กœ ๋„ค ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๋Š”๋‹ค.

4. ๋ผ์šฐํ„ฐ์— ์—ฐ๊ฒฐ๋œ ๋‚˜๋จธ์ง€ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  ์‹ถ๋‹ค๋ฉด (      )๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

5. ์ต์Šคํ”„๋ ˆ์Šค์˜ res, req ๊ฐ์ฒด๋Š” (     )๋ชจ๋“ˆ์˜ req, res ๊ฐ์ฒด๋ฅผ ํ™•์žฅํ•œ ๊ฒƒ์ด๋‹ค.  

6. (      )์„ ์ด์šฉํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด HTML์„ ๊ฐ„๋‹จํžˆ ์ฒ˜๋ฆฌํ•ด ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

7. ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ด์—์„œ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋Š” ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์ด (      )์ด ์•„๋‹Œ ๊ฒฝ์šฐ ํ‘œ์‹œ๋œ๋‹ค.

programming quiz

8. ๋‹ค์Œ์€ ์ต์Šคํ”„๋ ˆ์Šค ๋ชจ๋“ˆ์„ ์ด์šฉํ•ด ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค. ๋นˆ์นธ์„ ์ฑ„์šฐ์‹œ์˜ค.

const express = require('________'); // 1. Express ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

const app = _________; // 2. Express ๋ชจ๋“ˆ์„ ์‹คํ–‰ํ•ด app ๋ณ€์ˆ˜์— ํ• ๋‹น
app.set('port', process.env.______ || 3000); // 3. ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋  ํฌํŠธ๋ฅผ ์„ค์ •

app.______('/', (req, res) => { // 4. GET ์š”์ฒญ ์‹œ ์ˆ˜ํ–‰ํ•  ๋™์ž‘ ์ •์˜
  ________________ // 5. ์‘๋‹ต์œผ๋กœ 'Hello, Express' ๋ฉ”์‹œ์ง€ ์ „์†ก
});

app.listen(app.get('port'), () => {
  console.log(app.get('port'), '๋ฒˆ ํฌํŠธ์—์„œ ๋Œ€๊ธฐ ์ค‘'); 
});

 

9.

router.____('/', (req, res, next) => { //1. ์ ์ ˆํ•œ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
  next('______'); // 2. ๋‘ ๋ฒˆ์งธ์™€ ์„ธ ๋ฒˆ์งธ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ , ์ฃผ์†Œ์™€ ์ผ์น˜ํ•˜๋Š” ๋‹ค์Œ ๋ผ์šฐํ„ฐ๋กœ ์ด๋™
}, (req, res, next) => {
  console.log('์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค');
  ________; // 3. ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๋กœ ์ด๋™
}, (req, res, next) => {
  console.log('์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค');
  ________; // 4. ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๋กœ ์ด๋™
});

router.____('/', (req, res) => { //5. ์ ์ ˆํ•œ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
  console.log('์‹คํ–‰๋ฉ๋‹ˆ๋‹ค'); // 
  _________________; // 6. ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์œผ๋กœ 'Hello, Express' ๋ฉ”์‹œ์ง€ ์ „์†ก
});

 

 


Answer

1. ์ต์Šคํ”„๋ ˆ์Šค

2. ๋ฏธ๋“ค์›จ์–ด

3. err, req, res, next

4. next('route')

5. http

6. ํ…œํ”Œ๋ฆฟ ์—”์ง„

7. ๋ฐฐํฌ ํ™˜๊ฒฝ (production)

8.

const express = require('express'); // 1. Express ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

const app = express(); // 2. Express ๋ชจ๋“ˆ์„ ์‹คํ–‰ํ•ด app ๋ณ€์ˆ˜์— ํ• ๋‹น
app.set('port', process.env.PORT || 3000); // 3. ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋  ํฌํŠธ๋ฅผ ์„ค์ •

app.get('/', (req, res) => { // 4. GET ์š”์ฒญ ์‹œ ์ˆ˜ํ–‰ํ•  ๋™์ž‘ ์ •์˜
  res.send('Hello, Express'); // 5. ์‘๋‹ต์œผ๋กœ 'Hello, Express' ๋ฉ”์‹œ์ง€ ์ „์†ก
});

app.listen(app.get('port'), () => { 
  console.log(app.get('port'), '๋ฒˆ ํฌํŠธ์—์„œ ๋Œ€๊ธฐ ์ค‘');
});

9.

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

router.get('/', (req, res) => {
  console.log('์‹คํ–‰๋ฉ๋‹ˆ๋‹ค');
  res.send('Hello, Express');
});

 

 

 

์ถœ์ฒ˜) ์กฐํ˜„์ •, ใ€ŒNode.js ๊ต๊ณผ์„œ ๊ฐœ์ • 3ํŒใ€, ๊ธธ๋ฒ—(2022), 6์žฅ

 

Corner node.js 2ํŒ€

Editor : Sullivan

 

 

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ