elice/WIL

[week_06] μ›Ήκ³Ό Express.js | μ›Ήμ˜ 이해, ν”„λ ˆμž„μ›Œν¬, Express.js의 ꡬ쑰, λ™μž‘λ°©μ‹

건망디 2022. 2. 14. 01:21

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 μš”μ²­κ³Ό 응닡을 μ²˜λ¦¬ν•  수 있음