1. Express js ๋?
- ์น ๋ฐ ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ์ํ ๊ด๋ฒ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ Node.js ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ
- ๋จ์ผ ํ์ด์ง, ๋ค์ค ํ์ด์ง ๋ฐ ํ์ด๋ธ๋ฆฌ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๋ ๋ฐ ์ฌ์ฉ
- Node.js์ API๋ฅผ ๋จ์ํํ๊ณ ๊ธฐ๋ฅ์ ์ถ๊ฐ์์ผ, ํธ๋ฆฌํ๊ณ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ํ๋ ์์ํฌ
- cf. https://survey.stackoverflow.co/2022/#web-frameworks-and-technologies
- ๊ต์ฅํ ๋ง์ ์ฌ๋๋ค์ด ์ฌ์ฉํ๋ค.
2. Express ๊ธฐ๋ณธ ๊ตฌ์กฐ
1const express = require('express')23// Constants (1) ํฌํธ ๋ฐ ํธ์คํธ ์ง์ 4const PORT = 80805const HOST = '0.0.0.0'67// App8const app = express()910// Routes11app.get('/', (req, res) => {12res.send('Hello World')13})1415// Listen16app.listen(PORT, () => {17console.log('Running on http://localhost:8080')18})
4. res.json() vs res.send()
4.1 res.json()
- github express ์ฝ๋ : https://github.com/expressjs/express/blob/master/lib/response.js#L239
1res.json = function json(obj) {2var val = obj34// ์๋ต......56// settings7var app = this.app8var escape = app.get('json escape')9var replacer = app.get('json replacer')10var spaces = app.get('json spaces')11var body = stringify(val, replacer, spaces, escape)1213// content-type14if (!this.get('Content-Type')) {15this.set('Content-Type', 'application/json')16}1718return this.send(body)19}
- ๋จผ์ obj๋ JSON ๋ฌธ์์ด๋ก ๋ณํ.
- Content-Type ํค๋๊ฐ ์ธํ ๋์ง ์์์ ๊ฒฝ์ฐ this(res ๊ฐ์ฒด)์ Content-Type์ผ๋ก application/json์ ์ธํ .
- res.send(body)๋ฅผ ์คํ.
4.2 res.send()
- github express ์ฝ๋ : https://github.com/expressjs/express/blob/master/lib/response.js#L111
1res.send = function send(body) {2var chunk = body3// ์๋ต ..........45switch (typeof chunk) {6// string defaulting to html7case 'string':8if (!this.get('Content-Type')) {9this.type('html')10}11break12case 'boolean':13case 'number':14case 'object':15if (chunk === null) {16chunk = ''17} else if (Buffer.isBuffer(chunk)) {18if (!this.get('Content-Type')) {19this.type('bin')20}21} else {22return this.json(chunk)23}24break25}26// ์๋ต....27return this28}
- 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 ์ฐจ์ด์
1res.end('<p>some html</p>')2res.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 ์ค์น
1npm install -D nodemon
- nodemon ํจํค์ง๋ฅผ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ง ์ฌ์ฉํ ์ ์๊ฒ ์ค์นํ๊ฒ ์ต๋๋ค.
- ๊ทธ๋ฌ๊ธฐ ์ํด์๋ โsave-dev ํน์ -D ํ๋๊ทธ๋ฅผ ์ด์ฉํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
7. middleware์ ๋ํด์
1request โฏ> Middleware 1 โฏ> Middleware 2 โฏ> Middleware 3 โฏ> response2โฒ3โ4next()
- Express๋ ์์ฒด ๊ธฐ๋ฅ์ด ์ต์ํ๋ ๋ผ์ฐํ ๋ฐ ๋ฏธ๋ค์จ์ด ์น ํ๋ ์์ํฌ
- Express ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณธ์ง์ ์ผ๋ก ์ผ๋ จ์ ๋ฏธ๋ค์จ์ด ๊ธฐ๋ฅ ํธ์ถ์ด๋ค.
๋ฏธ๋ค์จ์ด ๊ธฐ๋ฅ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฒญ-์๋ต ์ฃผ๊ธฐ์์์์ฒญ ๊ฐ์ฒด(req), ์๋ต ๊ฐ์ฒด(res), next ๋ฏธ๋ค์จ์ด ํจ์์ ์ ๊ทผํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค.
next ๋ฏธ๋ค์จ์ด๊ธฐ๋ฅ์ ์ผ๋ฐ์ ์ผ๋กnext๋ผ๋ ๋ณ์๋ก ํ์๋๋ค.
1const express = require('express')2const app = express()34// use ==> ๋ฏธ๋ค์จ์ด ๋ฑ๋ก5app.use((req, res, next) => {6res.send('Time : ', Date.now())7next() // ๋ค์ ๋ฏธ๋ค์จ์ด๋ก ์ด๋8})
Express ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณธ์ง์ ์ผ๋ก ์ผ๋ จ์ ๋ฏธ๋ค์จ์ด ๊ธฐ๋ฅ ํธ์ถ์ด๋ค.
1request โฏ> logger โฏ> bodyParser โฏ> cookieParser โฏ> ์๋ต... โฏ> response

8. 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 ๋ฑ๋ฑ (๋๋ถ๋ถ ์ฌ์ฉ๋ฒ์ด ๋น์ทํ๋ค)