elice/WIL

[week_06] ์›น๊ณผ Express.js | ์›น์˜ ์ดํ•ด, ํ”„๋ ˆ์ž„์›Œํฌ, Express.js์˜ ๊ตฌ์กฐ, ๋™์ž‘๋ฐฉ์‹

1. ์›น

  • ์‚ฌ์ „์  ์˜๋ฏธ: World Wide Web, ์ธํ„ฐ๋„ท์ƒ์—์„œ ๋™์ž‘ํ•˜๋Š” ๋ชจ๋“  ์„œ๋น„์Šค
  • ์ผ๋ฐ˜์  ์˜๋ฏธ: ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ ์ ‘์†ํ•ด์„œ ์ด์šฉํ•˜๋Š” ์„œ๋น„์Šค, ์›น ์‚ฌ์ดํŠธ

1-1. ์›น ์„œ๋น„์Šค ๋™์ž‘ ๋ฐฉ์‹

  • HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ๋ฐ˜๋ณต
  • HTTP ์š”์ฒญ
    • ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ์ง€ ์„œ๋ฒ„์—๊ฒŒ ์•Œ๋ฆฌ๋Š” ์—ญํ• 
    • ์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€, ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š”์ง€ ๋“ฑ์„ ๋‹ด๊ณ  ์žˆ์Œ
  • HTTP ์‘๋‹ต
    • HTTP ์š”์ฒญ์— ํ•ด๋‹นํ•˜๋Š” ์ ์ ˆํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• 
    • ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ์™€, ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก๋˜๋Š”์ง€ ๋“ฑ์„ ๋‹ด๊ณ  ์žˆ์Œ

1-2. ๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ์—”๋“œ

ํ”„๋ก ํŠธ์—”๋“œ

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ์›น ํŽ˜์ด์ง€๋ฅผ ์ฃผ๋กœ ๋‹ด๋‹น
  • = ํด๋ผ์ด์–ธํŠธ

๋ฐฑ์—”๋“œ

  • ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ฃผ๋กœ ๋‹ด๋‹น
  • = ์„œ๋ฒ„

1-3. ์ •์  ์›น๊ณผ ๋™์  ์›น

์ •์  ์›น

  • ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜์ง€ ์•Š๋Š” ํŽ˜์ด์ง€ โžก ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ 
  • Link๋ฅผ ํ†ตํ•œ ํŽ˜์ด์ง€ ์ด๋™ ์ •๋„๋งŒ ๊ฐ€๋Šฅ
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณ€ํ•˜์ง€ ์•Š๋Š” html ํŒŒ์ผ๋กœ ์ œ๊ณต

๋™์  ์›น

  • ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•จ โžก ์–‘๋ฐฉํ–ฅ ํ†ต์‹ 
  • ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๊ฐ€ ์œ ๊ธฐ์ ์œผ๋กœ ํ†ต์‹ ํ•˜๋ฉฐ ๋™์ž‘

1-4. ๋™์  ์›น์˜ ๋‘ ๊ฐ€์ง€ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

 

2. ์›น ํ”„๋ ˆ์ž„์›Œํฌ

  • ์›น ์„œ๋น„์Šค์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•ด์ฃผ๋Š”(Web) ๋‹ค์–‘ํ•œ ๋„๊ตฌ๋“ค์˜ ๋ชจ์Œ(Framework)
  • ์ •ํ˜•ํ™”๋œ ๋ถ€๋ถ„์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ , ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ง‘์ค‘ํ•ด์„œ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.

2-1. ์›น ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์š”์†Œ

์›น ์„œ๋น„์Šค์˜ ์ •ํ˜•ํ™” ๋œ ๊ตฌ์„ฑ์„ ๋งŽ์€ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต

1) HTTP ์š”์ฒญ/์‘๋‹ต ์ฒ˜๋ฆฌ

  • ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š”์ง€, ์–ด๋–ค ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์ด ์ˆ˜์‹ ๋˜์—ˆ๋Š”์ง€ ๋“ฑ
  • ์‘๋‹ต ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ํ˜•์‹์ธ์ง€, ์‘๋‹ต ์ƒํƒœ๊ฐ€ ์ •์ƒ์ ์ธ์ง€ ๋“ฑ

2) ๋ผ์šฐํŒ…

  • HTTP ์š”์ฒญ์„ ๋ถ„๊ธฐํ•˜๋Š” ๋ฐฉ๋ฒ•
  • HTTP ์š”์ฒญ URL์— ํ•ด๋‹นํ•˜๋Š” ์•Œ๋งž์€ ์‘๋‹ต์˜ ๊ฒฝ๋กœ๋ฅผ ๋ฏธ๋ฆฌ ์„ค์ •

3) HTML Templating

  • SSR์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•
  • SSR์—์„œ ์‘๋‹ต์œผ๋กœ ๋ณด๋‚ผ HTML์„ ์„œ๋ฒ„์—์„œ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด HTML์˜ ๋ผˆ๋Œ€๋ฅผ ๋ฏธ๋ฆฌ ์ž‘์„ฑ

 

3. Express.js

3-1. Express.js๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  • Node.js์˜ ์›น ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ์›น ํ”„๋ ˆ์ž„์›Œํฌ
  • ํ•„์š”์— ๋”ฐ๋ผ ์œ ์—ฐํ•œ ๊ตฌ์กฐ ์„ค์ • ๊ฐ€๋Šฅ
  • ๋‹ค์–‘ํ•œ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ

3-2. Express.js ์‹œ์ž‘ํ•˜๊ธฐ

  • express-generator: ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ๊ธฐ, ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ž๋™ ์ƒ์„ฑ
$npm i -g express-generator
$express my-web
$cd my-web
$npm i
$npm start
  • npx + express-generator๋กœ express-generator๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
$npx express-generator my-web
$cd my-web
$npm i
$npm start

3-3. Express.js์˜ ๊ตฌ์กฐ

app.js Express.js์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ํŒŒ์ผ, ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋Šฅ์„ ์ •์˜
bin/www Express.js์˜ ์‹คํ–‰ ๋ถ€๋ถ„์„ ๋‹ด๋‹น, ํฌํŠธ์™€ ์‹คํ–‰ ์˜ค๋ฅ˜ ๋“ฑ์„ ์ •์˜
package.json ํ”„๋กœ์ ํŠธ ์˜์กด์„ฑ ๋ฐ ์Šคํฌ๋ฆฝํŠธ ์ •์˜
public ์ฝ”๋“œ๋ฅผ ํ†ตํ•˜์ง€ ์•Š๊ณ , ์ง์ ‘ ์ œ๊ณต๋˜๋Š” ํŒŒ์ผ ๋””๋ ‰ํ„ฐ๋ฆฌ
routes ๋ผ์šฐํŒ… ํŒŒ์ผ ๋””๋ ‰ํ„ฐ๋ฆฌ
views HTML Template ๋””๋ ‰ํ„ฐ๋ฆฌ

 

4. Express.js์˜ ๋™์ž‘ ๋ฐฉ์‹

express-generator ๋กœ ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ ‘๊ทผ
npm start ๋กœ Express.js ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰
localhost:3000 ์— ์ ‘์†ํ•˜์—ฌ Welcome to Express ํŽ˜์ด์ง€ ํ™•์ธ

4-1. app.js

var express = require('express');
...
var app = express();
  • require ๋ชจ๋“ˆ๋กœ ๋กœ๋“œ๊ฐ€ ๋œ express๋ฅผ ํ•จ์ˆ˜ํ˜• ๋ชจ๋“ˆ๋กœ ์‚ฌ์šฉํ•ด์„œ app ๊ฐ์ฒด ์ƒ์„ฑ
  • app ๊ฐ์ฒด: Express.js์˜ ๊ธฐ๋Šฅ์„ ๋‹ด์€ ๊ฐ์ฒด
  • Express.js์˜ ๋ชจ๋“  ๋™์ž‘์€ app ๊ฐ์ฒด์— ์ •์˜ โžก express๋Š” app ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๋ชจ๋“  ์š”์ฒญ์„ ์ฒ˜๋ฆฌ
โœจ app ๊ฐ์ฒด์˜ ์ฃผ์š” ๊ธฐ๋Šฅ
app.use( )
    - middleware๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜
app.listen( )
    - http ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ํ•จ์ˆ˜
    - express-generator๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด http.createServer๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, app.listen ํ•จ์ˆ˜๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ
app.locals
    - app์—์„œ ์‚ฌ์šฉํ•  ๊ณตํ†ต ์ƒ์ˆ˜
    - Express.js์—์„  global ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ์ด ๊ฐ’ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

4-2. ๋ผ์šฐํŒ…

1) app ๋ผ์šฐํŒ…

app.get('/', (req, res) => {
	res.send('GET /');
});
app.post('/', (req, res) => {
	res.send('POST /');
});
app.all('/all', (req, res) => {
	res.send('ANY /');
});
  • app ๊ฐ์ฒด์— ์ง์ ‘ get, post, put, delete ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTP method๋กœ ๋ผ์šฐํŒ… ๊ฐ€๋Šฅ
  • HTTP method์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž = ์ด ๋ผ์šฐํŒ…์„ ์‹คํ–‰ํ•  URL
  • HTTP method์˜ ๋งˆ์ง€๋ง‰ ์ธ์ž = ์ด ๋ผ์šฐํŒ…์ด ์‹คํ–‰๋  ๋•Œ ์ž‘๋™ํ•˜๋Š” ํ•จ์ˆ˜
  • all ํ•จ์ˆ˜ ์‚ฌ์šฉ ์‹œ, HTTP method์— ์ƒ๊ด€์—†์ด ๋ผ์šฐํŒ… ๊ฐ€๋Šฅ

2) Express.Router

const express = require('express');
const router = express.router();

router.get('/', (req, res, next) => {
	res.send('respond with a resource');
});

module.exports = router;
  • router ๊ฐ์ฒด์—๋„ get, post, put, delete ํ•จ์ˆ˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ฒซ ๋ฒˆ์งธ ์ธ์ž = ๋ผ์šฐํŒ… ๋  URL
  • ๋งˆ์ง€๋ง‰ ์ธ์ž = ๋ผ์šฐํŒ… ์‹œ ์‹คํ–‰๋  ํ•จ์ˆ˜
  • ๋ผ์šฐํ„ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“ˆ๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉ
// .app.js
const userRouter = require('./routes/users');
const app = express();

app.use('/users', userRouter);

// .routes/users.js
const petRouter = require('./pets');
const router = express.Router();

router.use('/pets', petRouter);

module.exports = router;
  • ์ž‘์„ฑ๋œ ๋ผ์šฐํ„ฐ ๋ชจ๋“ˆ์„ app ์— use ํ•จ์ˆ˜๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • router ๊ฐ์ฒด์—๋„ ํ•˜์œ„ ๋ผ์šฐํ„ฐ๋ฅผ use ํ•จ์ˆ˜๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

3) path parameter ์‚ฌ์šฉ

  • ์ฃผ์†Œ์˜ ์ผ๋ถ€๋ฅผ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
/users/:id โžก /users/123, /users/456 ๋“ฑ์œผ๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ ๋ผ์šฐํŒ… ์ ์šฉ
/messages/:from-:to โžก /message/123-456 ๋“ฑ์œผ๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ ๋ผ์šฐํŒ… ์ ์šฉ

4) Request Handler

  • ๋ผ์šฐํŒ…์— ์ ์šฉ๋˜๋Š” ํ•จ์ˆ˜
  • HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜
  • ์„ค์ •๋œ ๋ผ์šฐํŒ… ๊ฒฝ๋กœ์— ํ•ด๋‹นํ•˜๋Š” ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์‹คํ–‰
router.get('/:id', (req, res) => {
	const id = req.params.id;
    res.send(`hello ${id}`);
});
  • router๋‚˜ app์˜ HTTP method ํ•จ์ˆ˜์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜
  • Request ๊ฐ์ฒด์™€ Response ๊ฐ์ฒด ์กด์žฌ
  • Request ๊ฐ์ฒด์˜ ์ฃผ์š” ๊ฐ’ ๋ฐ ํ•จ์ˆ˜
req.params URL ํ‘œํ˜„ ์ค‘ /path/:id ์—์„œ :id ๋ฅผ req.params.id๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
req.queries URL ํ‘œํ˜„ ์ค‘ /path?page=2 ์—์„œ page ๋ถ€๋ถ„์„ req.queries.page๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
req.body ์ผ๋ฐ˜์ ์œผ๋กœ POST ์š”์ฒญ์˜ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ๊ณ , req.body์— ์š”์ฒญ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ๋“ค์–ด์˜ด
req.get('') HTTP Request์˜ ํ—ค๋” ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ, req.get('ํ—ค๋”๋ช…')
  • Response ๊ฐ์ฒด์˜ ์ฃผ์š” ๊ฐ’ ๋ฐ ํ•จ์ˆ˜
res.send() text ํ˜•์‹์˜ HTTP ์‘๋‹ต ์ „์†ก
res.json() json ํ˜•์‹์˜ HTTP ์‘๋‹ต ์ „์†ก
res.render() HTML Template์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™”๋ฉด ์ „์†ก
res.set() HTTP ์‘๋‹ต์˜ ํ—ค๋” ์„ค์ •
res.status() HTTP ์‘๋‹ต์˜ ์ƒํƒœ ๊ฐ’ ์„ค์ •
โœจ Express.js ๋™์ž‘๋ฐฉ์‹ ์ •๋ฆฌ
Express.js ๋Š” app ๊ฐ์ฒด๋ฅผ ์‹œ์ž‘์œผ๋กœ ๋ชจ๋“  ๋™์ž‘์ด ์ด๋ฃจ์–ด์ง
app ๊ฐ์ฒด๋‚˜ Express.Router ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ์šฐํŒ…์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ
Request Handler๋ฅผ ํ†ตํ•ด HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ