๐ŸŽ‰ berenickt ๋ธ”๋กœ๊ทธ์— ์˜จ ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰
Back
ExpressJs
01-Express.js

1. Express js ๋ž€?

  • ์›น ๋ฐ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ•์„ ์œ„ํ•œ ๊ด‘๋ฒ”์œ„ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” Node.js ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ
  • ๋‹จ์ผ ํŽ˜์ด์ง€, ๋‹ค์ค‘ ํŽ˜์ด์ง€ ๋ฐ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ
  • Node.js์˜ API๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€์‹œ์ผœ, ํŽธ๋ฆฌํ•˜๊ณ  ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
  • cf. https://survey.stackoverflow.co/2022/#web-frameworks-and-technologies
    • ๊ต‰์žฅํžˆ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•œ๋‹ค.

2. Express ๊ธฐ๋ณธ ๊ตฌ์กฐ

1
const express = require('express')
2
3
// Constants (1) ํฌํŠธ ๋ฐ ํ˜ธ์ŠคํŠธ ์ง€์ •
4
const PORT = 8080
5
const HOST = '0.0.0.0'
6
7
// App
8
const app = express()
9
10
// Routes
11
app.get('/', (req, res) => {
12
res.send('Hello World')
13
})
14
15
// Listen
16
app.listen(PORT, () => {
17
console.log('Running on http://localhost:8080')
18
})

4. res.json() vs res.send()

4.1 res.json()

1
res.json = function json(obj) {
2
var val = obj
3
4
// ์ƒ๋žต......
5
6
// settings
7
var app = this.app
8
var escape = app.get('json escape')
9
var replacer = app.get('json replacer')
10
var spaces = app.get('json spaces')
11
var body = stringify(val, replacer, spaces, escape)
12
13
// content-type
14
if (!this.get('Content-Type')) {
15
this.set('Content-Type', 'application/json')
16
}
17
18
return this.send(body)
19
}
  • ๋จผ์ € obj๋Š” JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜.
  • Content-Type ํ—ค๋”๊ฐ€ ์„ธํŒ…๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ this(res ๊ฐ์ฒด)์— Content-Type์œผ๋กœ application/json์„ ์„ธํŒ….
  • res.send(body)๋ฅผ ์‹คํ–‰.

4.2 res.send()

1
res.send = function send(body) {
2
var chunk = body
3
// ์ƒ๋žต ..........
4
5
switch (typeof chunk) {
6
// string defaulting to html
7
case 'string':
8
if (!this.get('Content-Type')) {
9
this.type('html')
10
}
11
break
12
case 'boolean':
13
case 'number':
14
case 'object':
15
if (chunk === null) {
16
chunk = ''
17
} else if (Buffer.isBuffer(chunk)) {
18
if (!this.get('Content-Type')) {
19
this.type('bin')
20
}
21
} else {
22
return this.json(chunk)
23
}
24
break
25
}
26
// ์ƒ๋žต....
27
return this
28
}
  • body์˜ ํƒ€์ž… ์ฒดํฌ.
  • object ์ผ ๊ฒฝ์šฐ res.json ํ˜ธ์ถœ
    • ==> ํ•˜์ง€๋งŒ res.json์—์„œ๋Š” ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พผ ํ›„ res.send๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
    • res.send์— ๋‹ค์‹œ ์™€์„œ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.
  • ์ฒ˜๋ฆฌ ์ˆœ์„œ
    • res.send(object)
    • res.json(object)
    • res.send(string)
  • res.send๋กœ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด, ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœ์ด ๋” ์ผ์–ด๋‚œ๋‹ค.

4.3 ๊ฒฐ๋ก 

  • res.send์™€ res.json ์‚ฌ์ด์—๋Š” ์‹ค์ œ ์ฐจ์ด ์™ธ๋ถ€์—์„œ ๋ณด๊ธฐ์—๋Š” ์ฐจ์ด๊ฐ€ ์—†์ง€๋งŒ,
  • res.send ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœ ํ•œ ๋ฒˆ์ด ๋” ์ผ์–ด๋‚œ๋‹ค.
  • ๋˜ํ•œ object๋ฅผ ๋ณด๋‚ผ ๋• res.json()์„ ์ด์šฉํ•˜๋Š” ๊ฒŒ ๋” ์ง๊ด€์ ์ด๊ธฐ๋•Œ๋ฌธ์— res.json()์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.

5. res.send() vs res.end()

5.1 res.end()

  • ๋งˆ์ง€๋ง‰์œผ๋กœ ์„ธ์…˜์„ ์ข…๋ฃŒํ•ด์•ผ ํ•  ๋–„, ์“ฐ๋Š” ํ•จ์ˆ˜
  • res.end()๋กœ ์ข…๋ฃŒํ•ด์•ผ ํ•˜๋Š” ๋•Œ
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  ์‘๋‹ต์„ ์ข…๋ฃŒํ•˜๋ ค๋ฉด res.end()๋ฅผ ์‚ฌ์šฉ
    • ์ด๊ฒƒ์€ 404 ํŽ˜์ด์ง€์— ์œ ์šฉ
    • res.status(404).end()
  • res.end()๋กœ ์ข…๋ฃŒํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๋•Œ
    • ๋ฐ์ดํ„ฐ๋ฅผ res.json() ์ด๋‚˜ res.send()๋กœ ๋ณด๋‚ด๋ฉด ์•Œ์•„์„œ ์ข…๋ฃŒํ•จ

5.2 ์ฐจ์ด์ 

1
res.end('<p>some html</p>')
2
res.send('<p>some html</p>')

res.end์— response Headers๋ฅผ ๋ณด๋ฉด, (1) Content-Type, (2) ETag๊ฐ€ ์—†๋‹ค.

๐Ÿ’ก ETag๋ž€?

  • ETag HTTP ์‘๋‹ต ํ—ค๋”๋Š” ๋ฆฌ์†Œ์Šค์˜ ํŠน์ • ๋ฒ„์ „์— ๋Œ€ํ•œ ์‹๋ณ„์ž
  • ์ฝ˜ํ…์ธ ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์›น ์„œ๋ฒ„์—์„œ ์ „์ฒด ์‘๋‹ต์„ ๋ณด๋‚ผ ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ
  • ์บ์‹œ๋ฅผ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๋Œ€์—ญํญ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.

5.3 ๊ฒฐ๋ก 

  • html, ํ…์ŠคํŠธ ๋“ฑ์˜ ์ฝ˜ํ…์ธ ๋ฅผ ๋ณด๋‚ผ ๊ฒฝ์šฐ, res.end๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค res.send๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ํ›จ์”ฌ ํšจ์œจ์ ์ด๋‹ค.
  • ์™œ? res.send์—๋Š” Content-Type๊ณผ ETag๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—

6. ํฌ์ŠคํŠธ๋งจ ์„ค์น˜

  • Postman์€ ๊ฐœ๋ฐœํ•œ API๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ , ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๊ณต์œ ํ•˜์—ฌ API ๊ฐœ๋ฐœ์˜ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ํ”Œ๋žซํผ
  • ํ˜„์žฌ API์— ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ํฌ์ŠคํŠธ๋งจ์„ ์‚ฌ์šฉํ•ด์„œ ์š”์ฒญ์„ ์ž„์˜๋กœ ์ „๋‹ฌํ•ด์ฃผ๊ฒ ๋‹ค.
  • https://www.postman.com/downloads/

6.1 nodemon ์„ค์น˜

1
npm install -D nodemon
  • nodemon ํŒจํ‚ค์ง€๋ฅผ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค์น˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” โ€”save-dev ํ˜น์€ -D ํ”Œ๋ž˜๊ทธ๋ฅผ ์ด์šฉํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

7. middleware์— ๋Œ€ํ•ด์„œ

1
request โŽฏ> Middleware 1 โŽฏ> Middleware 2 โŽฏ> Middleware 3 โŽฏ> response
2
โ–ฒ
3
โ”‚
4
next()
  • Express๋Š” ์ž์ฒด ๊ธฐ๋Šฅ์ด ์ตœ์†Œํ™”๋œ ๋ผ์šฐํŒ… ๋ฐ ๋ฏธ๋“ค์›จ์–ด ์›น ํ”„๋ ˆ์ž„์›Œํฌ
  • Express ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ณธ์งˆ์ ์œผ๋กœ ์ผ๋ จ์˜ ๋ฏธ๋“ค์›จ์–ด ๊ธฐ๋Šฅ ํ˜ธ์ถœ์ด๋‹ค.
  • ๋ฏธ๋“ค์›จ์–ด ๊ธฐ๋Šฅ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”์ฒญ-์‘๋‹ต ์ฃผ๊ธฐ์—์„œ
    • ์š”์ฒญ ๊ฐ์ฒด(req), ์‘๋‹ต ๊ฐ์ฒด(res), next ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
  • next ๋ฏธ๋“ค์›จ์–ด ๊ธฐ๋Šฅ์€ ์ผ๋ฐ˜์ ์œผ๋กœ next๋ผ๋Š” ๋ณ€์ˆ˜๋กœ ํ‘œ์‹œ๋œ๋‹ค.
1
const express = require('express')
2
const app = express()
3
4
// use ==> ๋ฏธ๋“ค์›จ์–ด ๋“ฑ๋ก
5
app.use((req, res, next) => {
6
res.send('Time : ', Date.now())
7
next() // ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๋กœ ์ด๋™
8
})

Express ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ณธ์งˆ์ ์œผ๋กœ ์ผ๋ จ์˜ ๋ฏธ๋“ค์›จ์–ด ๊ธฐ๋Šฅ ํ˜ธ์ถœ์ด๋‹ค.

1
request โŽฏ> logger โŽฏ> bodyParser โŽฏ> cookieParser โŽฏ> ์ƒ๋žต... โŽฏ> response

express-๋ฏธ๋“ค์›จ์–ด


8. MVC ํŒจํ„ด

MVC ํŒจํ„ด

  • Model : ๋ฐ์ดํ„ฐ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ด€๋ฆฌ
  • View : ๋ ˆ์ด์•„์›ƒ๊ณผ ํ™”๋ฉด์„ ์ฒ˜๋ฆฌ
  • Controller : ๋ช…๋ น์„ ๋ชจ๋ธ๊ณผ ๋ทฐ ๋ถ€๋ถ„์œผ๋กœ ๋ผ์šฐํŒ…

๐Ÿ’ก ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์˜ˆ์‹œ

  • View : ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธฐ ๋ฒ„ํŠผ ํด๋ฆญ
  • Controller : Model์—๊ฒŒ ์•„์ดํ…œ์„ ์ถ”๊ฐ€ํ•˜๋ผ๊ณ  ์•Œ๋ ค์คŒ
  • Model : ์•„์ดํ…œ์ด ์ถ”๊ฐ€ํ•ด ๋ณ€๊ฒฝ๋œ ๋ชจ๋ธ์„ view์—๊ฒŒ ์•Œ๋ ค์„œ ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธ๋˜๊ฒŒ ํ•จ

9. ํŒŒ์ผ ์ „์†ก(res.sendFile)

  • ์ •์ ์ธ ํŒŒ์ผ์„ ๋ณด๊ด€ํ•  ํด๋” ์ƒ์„ฑ
  • res.sendFile

10. Template Engine ์ข…๋ฅ˜

  • Template Engine : ๋™์ ์ธ ๊ฒฐ๊ณผ(๋ฐ์ดํ„ฐ)๋ฅผ ์ •์  ํŒŒ์ผ(HTML)์— ๋‹ด์•„์ค€๋‹ค.
  • Express.js๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ํ†ตํ•ด ์„œ๋ฒ„ ์ธก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋™์  HTML ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.
  • ์ข…๋ฅ˜ : Pug, EJS, hbs ๋“ฑ๋“ฑ (๋Œ€๋ถ€๋ถ„ ์‚ฌ์šฉ๋ฒ•์ด ๋น„์Šทํ•˜๋‹ค)