ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ์์ฒญ(request)์ ๋ณด๋ด๊ณ , ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์๋ต(response)๋ฅผ ๋ณด๋ธ๋ค.
๋ฐ๋ผ์, ์๋ฒ์๋ ์์ฒญ์ ๋ฐ๋ ๋ถ๋ถ๊ณผ ๋ณด๋ด๋ ๋ถ๋ถ์ด ์์ด์ผ ํ๋ค.
const http = require('http');
http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8'});
res.write('<h1>Hello Node!</h1>');
res.end('<p>Hello Server!</p>');
})
.listen(8080, () => {
console.log('8080์์ ๋๊ธฐ ์ค');
});
โ createServer
๋ฉ์๋์ ์๋ ์ธ์๋ก ์์ฒญ์ ๋ํ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฃ๊ณ , ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋๋ค.
์ฝ๋ฐฑ ๋ถ๋ถ์ ๋ณด๋ฉด request์ ์ค๋ง์ธ req, response์ ์ค๋ง์ธ res๊ฐ ์๋ค. (๋ฌผ๋ก ๋ณ๊ฒฝํด๋ ๋ฌด๋ฐฉํ๋ค!)
์ถ์ธกํ ์ ์๋ฏ, req ๊ฐ์ฒด๋ ์์ฒญ์ ๊ดํ, res ๊ฐ์ฒด๋ ์๋ต์ ๊ดํ ์ ๋ณด๋ค์ ๋ด๊ณ ์๋ค.
โ writeHead
์๋ต์ ๋ํ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ ๋ฉ์๋๋ก, ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์์ฒญ์ด ์ฑ๊ณตํ์์ ์๋ฏธํ๋ 200, ๋ ๋ฒ์งธ ์ธ์๋ก ์ฝํ ์ธ ์ ํ์์ ์๋ฆฌ๊ณ ์๋ค.
์ด ์ ๋ณด๊ฐ ๊ธฐ๋ก๋๋ ๊ณณ์ด ๋ฐ๋ก ํค๋(Header)์ด๋ค.
โ write
์ฒซ ๋ฒ์งธ ์ธ์๋ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ผ ๋ฐ์ดํฐ์ด๋ค. ๋ฌธ์์ด, ๋ฒํผ ๋ฑ ๋ค์ํ ๊ฒ๋ค์ ๋ณด๋ผ ์๋ ์๊ณ , ์ฌ๋ฌ ๋ฒ ํธ์ถํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ๊ฐ ๋ณด๋ผ ์๋ ์๋ค.
์ด ๋ฐ์ดํฐ๊ฐ ๊ธฐ๋ก๋๋ ๋ถ๋ถ์ด ๋ฐ๋ก ๋ณธ๋ฌธ(Body)์ด๋ค.
โ end
์๋ต์ ์ข ๋ฃํ๋ ๋ฉ์๋์ด๋ค. ์ธ์๊ฐ ์๋ค๋ฉด, ํด๋น ์ธ์๋ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด๊ณ ์๋ต์ ์ข ๋ฃํ๋ค. ๋ธ๋ผ์ฐ์ ๋ ์๋ต ๋ด์ฉ์ ๋ฐ์์ ๋ ๋๋งํ๋ค.
โ listen
์๋ฒ๋ฅผ ์ฐ๊ฒฐํ๋ ๋ถ๋ถ์ผ๋ก, ํด๋ผ์ด์ธํธ์ ๊ณต๊ฐํ ํฌํธ ๋ฒํธ์ ํฌํธ ์ฐ๊ฒฐ ํ ์คํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฃ๋๋ค.
REST. REpresentational State Transfer์ ์ค์๋ง์ด๋ค. ์๋ฒ์ ์์์ ์ ์ํ๊ณ , ์์์ ๋ํ ์ฃผ์๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ด๊ธฐ๋ ํ๋ค. ์ฃผ์ ์ธ์๋ HTTP ์์ฒญ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋๋ฐ, GET๊ณผ POST ๋ฑ์ ๋ฉ์๋ ์ธ์๋ ๋ค๋ฅธ ๋ฉ์๋๋ค์ด ์กด์ฌํ๋ค.
GET : ์๋ฒ ์์์ ๊ฐ์ ธ์ค๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค.
POST : ์๋ฒ์ ์์์ ์๋ก ๋ฑ๋กํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค.
PUT : ์๋ฒ์ ์์์ ์์ฒญ์ ๋ค์ด ์๋ ์์์ผ๋ก ์นํํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค.
PATCH : ์๋ฒ ์์์ ์ผ๋ถ๋ง ์์ ํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค.
DELETE : ์๋ฒ์ ์์์ ์ญ์ ํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค.
OPTION : ์์ฒญ์ ํ๊ธฐ ์ , ํต์ ์ต์ ์ ์ค๋ช ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
โ RESTful?
REST๋ฅผ ๋ฐ๋ฅด๋ ์๋ฒ๋ฅผ RESTfulํ๋ค๊ณ ํํํ๋ค. ์ฃผ์ ๊ตฌ์กฐ๋ฅผ ์ฒด๊ณํํด ๋ ๋ค, ์ฝ๋ฉ์ ์์ํ๋ฉด ์ฒด๊ณ์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํ๋ค.
if (req.method === 'GET') {
if (req.url === '/') {
์ฝ๋๋ฅผ ์ผ๋ถ๋ง ๋ฐ์ทํด ์๋ค. ์ฝ๋ ์ค, req.method๋ผ๋ ๋ถ๋ถ์ด ์๋ค.
โ req.method
์ด ๋ถ๋ถ์์ HTTP ์์ฒญ ๋ฉ์๋๋ฅผ ๊ตฌ๋ถํ๊ณ ์๋ค. GET์ผ ๊ฒฝ์ฐ, ๋ค์ req.url๋ก ์์ฒญ ์ฃผ์๋ฅผ ๊ตฌ๋ถํด ์ค๋ค. ์กด์ฌํ์ง ์๋ ํ์ผ์ ์์ฒญํ๊ฑฐ๋, GET ๋ฉ์๋ ์์ฒญ์ด ์๋ ๊ฒฝ์ฐ 404 ์๋ฌ๋ฅผ ์ ์กํ๋ค.
โ req.on()
POST, PUT ์์ฒญ์ ์ฒ๋ฆฌํ ๋ req.on('data'), req.on('end')์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ ์๋ค. ์ด๋ ์์ฒญ์ ๋ณธ๋ฌธ์ ๋ค์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด๊ธฐ ์ํ ์์ ์ด๋ค. req์ res๋ ๋ด๋ถ์ ์ผ๋ก๋ ๊ฐ๊ฐ readStream๊ณผ writeStream์ผ๋ก ๋์ด ์์ผ๋ฏ๋ก, ์์ฒญ/์๋ต์ ๋ฐ์ดํฐ๊ฐ ์คํธ๋ฆผ ํ์์ผ๋ก ์ ๋ฌ๋๋ค. on์์ ๋ณผ ์ ์๋ฏ, ์ด๋ฒคํธ๋ ๋ฌ๋ ค์๋ค.
๋จ, ๋ฐ์ดํฐ๋ ๋ฌธ์์ด์ด๊ธฐ ๋๋ฌธ์ JSON.parse๋ฅผ ์ด์ฉํด JSON์ผ๋ก ๋ง๋๋ ๊ฒ์ ์์ง ๋ง์.
์๋ฒ๊ฐ ์์ฒญ์ ๋ํ ์๋ต์ ํ ๋ ๊ฐ์ด ๋ณด๋ด๋ ๊ฒ์ด๋ค. ์ ํจ ๊ธฐ๊ฐ์ด ์์ผ๋ฉฐ, ๋จ์ํ ํค-๊ฐ์ ์์ด๋ค. ๋ธ๋ผ์ฐ์ ๋ ์ฟ ํค๊ฐ ์๋ค๋ฉด ์๋์ผ๋ก ๋๋ดํ์ฌ ๋ณด๋ด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ฒ๋ฆฌํ ํ์๊ฐ ์๊ณ , ์๋ฒ์์ ๋ธ๋ผ์ฐ์ ๋ก ์ฟ ํค๋ฅผ ๋ณด๋ผ ๋๋ง ์ฒ๋ฆฌํด ์ฃผ๋ฉด ๋๋ค.
์ฟ ํค๋ ์์ฒญ์ ํค๋์ ๋ด๊ฒจ ์ ์ก๋๋ฉฐ, ๋ธ๋ผ์ฐ์ ๋ ์๋ต์ ํค๋(Set-Cookie)์ ๋ฐ๋ผ ์ฟ ํค๋ฅผ ์ ์ฅํ๋ค.
โ ์ฟ ํค๊ฐ ์ ์ถํ ๋์ ๊ฐ์ธ์ ๋ณด
์ฟ ํค๋ ์ฌ์ฉ์๊ฐ ๋๊ตฌ์ธ์ง ์ถ์ ํ๊ณ ์๋ค. ๊ฐ์ธ์ ๋ณด ์ ์ถ์ ์ํ์ด ์๊ธฐ์ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ฟ ํค์ ์ ์ฅํ์ง ์๋๋ก ๊ถ๊ณ ํ๊ณ ์๊ณ , ์ฃผ๊ธฐ์ ์ผ๋ก ์ญ์ ํด์ผ ํ๋ ์ด์ ๋ ๊ทธ๊ฒ์ด๋ค.
์ฟ ํค๋ฅผ ์ค์ ํ ๋๋ ๊ฐ์ข ์ต์ ์ ๋ฃ์ ์ ์๊ณ , ์ต์ ์ฌ์ด์ ์ธ๋ฏธ์ฝ๋ก ์ ์จ์ ๊ตฌ๋ถํ๋ฉด ๋๋ค. ์ฟ ํค์ ๋ค์ด๊ฐ์๋ ์ ๋๋ ๊ธ์๋ก ํ๊ธ๊ณผ ์ค๋ฐ๊ฟ์ด ์๋ค. ํ๊ธ์ ์ฌ์ฉํ๊ณ ์ถ์ ๋๋ encodeURIComponent๋ก ๊ฐ์ธ์ ๋ฃ๋๋ค.
์ฟ ํค๋ช =์ฟ ํค๊ฐ : ๊ธฐ๋ณธ์ ์ธ ์ฟ ํค์ ๊ฐ
Expires=๋ ์ง : ๋ง๋ฃ ๊ธฐํ
Max-age=์ด : ๋ ์ง ๋์ ์ด๋ฅผ ์ ๋ ฅ
Domain=๋๋ฉ์ธ๋ช : ์ฟ ํค๊ฐ ์ ์ก๋ ๋๋ฉ์ธ์ ํน์
Path=URL : ์ฟ ํค๊ฐ ์ ์ก๋ URL์ ํน์
Secure : HTTPS์ผ ๊ฒฝ์ฐ์๋ง ์ฟ ํค ์ ์ก
HttpOnly : ์ค์ ์ JS์์ ์ฟ ํค์ ์ ๊ทผ ๋ถ๊ฐ๋ฅ, ์ฟ ํค ์กฐ์์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ
2015๋ ๊ณต์์ ์ผ๋ก ๋ฐํ๋ HTTP/1.1์ ํ์ ๋ฒ์ ์ด๋ค. (์ฐ๋ฆฌ๊ฐ http2๋ฅผ ๊ณต๋ถํ๊ณ ์๋ 2022๋ 10์, ๋๋๊ฒ๋ 2022๋ 6์์ HTTP/3์ด ๊ณต๊ฐ๋์๋ค!)
HTTP1์ ํ ์คํธ ์์ฃผ์ ์ ์ก ํ๋กํ ์ฝ์ด์๋ค. ์น ๊ธฐ์ ์ด ๋ฐ์ ํจ์ ๋ฐ๋ผ ๊ณ ์ฉ๋์ ๋ฉํฐ๋ฏธ๋์ด ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ์ผ์ด ๋ง์์ก๊ณ , ์ด์ ๋ฐ๋ผ ์๋ก์ด ๋ฒ์ ์ HTTP๊ฐ ํ์ํด์ก๋ค. ์ด๋ฅผ ์ํด ์ ์๋ ๊ฒ์ด HTTP2์ด๋ค.
โ ๊ทธ๋ผ http3์ ๋ญ๋ฐ?
HTTP์ 3๋ฒ์งธ ๋ฉ์ด์ ๋ฒ์ ์ผ๋ก, HTTP1๊ณผ 2๊ฐ TCP๋ก ํต์ ํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ HTTP3์ UDP ๊ธฐ๋ฐ์ QUIC ํ๋กํ ์ฝ์ ์ด์ฉํ์ฌ ํต์ ํ๋ค.
ํฐ ์ฅ์ 3๊ฐ์ง๋, Zero RTT(Round Trip Time), ํจํท ์์ค์ ๋ํ ๋น ๋ฅธ ๋์, ์ฌ์ฉ์ IP๊ฐ ๋ฐ๋์ด๋ ์ฐ๊ฒฐ์ด ์ ์ง๋๋ ๊ฒ์ด๋ค. ์ผ๋ฐ์ ์ธ ์น ํ๊ฒฝ์์๋ HTTP/2์ HTTP/3์ ์ฐจ์ด๊ฐ ํฌ์ง ์์ ์ ์์ผ๋, ๋์์ ์๋น์ค ๋ฑ์์๋ ํฐ ์ฐจ์ด๋ฅผ ๋ณด์ธ๋ค.
์ด ์ ๋๋ก๋ง ์์๋ณด๊ณ , ๋ค์ ๋ ธ๋๋ก ๋์๊ฐ์.
์ฐ๋ฆฌ๋ https ๋ชจ๋์ ์ฌ์ฉํ์ฌ ์ํธํ๋ฅผ ์ ์ฉํ ์ ์๋ค. ์ํธํ๋ฅผ ์ ์ฉํ๋ ๋งํผ, https๋ ์ธ์ฆ๋ฐ์ ์ฌ์ฉ์๋ง ์ฌ์ฉํ ์ ์๋ค.
โ ๋ ธ๋์ http2 ๋ชจ๋
์ SSL ์ํธํ์ ๋๋ถ์ด ์ต์ http ํ๋กํ ์ฝ์ธ http/2๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค. https ๋ชจ๋๊ณผ ๊ฑฐ์ ์ ์ฌํ๊ฒ ์ฌ์ฉํ๋, https๋ฅผ http2๋ก, createServer๋ฅผ createSecureServer ๋ฉ์๋๋ก ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธ ํ๋ก์ธ์ค๋ก ๋์ํ๋ ๋ ธ๋๊ฐ CPU ์ฝ์ด๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ์ ์๊ฒ ํด ์ฃผ๋ ๋ชจ๋์ด๋ค. ํฌํธ๋ฅผ ๊ณต์ ํ๋ ๋ ธ๋๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์, ์์ฒญ์ด ๋ง์ด ๋ค์ด์์ ๋ ๋ณ๋ ฌ๋ก ์คํ๋ ์๋ฒ์ ๊ฐ์๋งํผ ์์ฒญ์ด ๋ถ์ฐ๋๊ฒ ํ ์ ์๋ค. ์ฆ, ์๋ฒ์ ๋ฌด๋ฆฌ๋ฅผ ๋ ์ค ์ ์๋ค.
โ ์ฃผ์ํด์ผ ํ ์
์ค๋ ๋๊ฐ ์๋๋ผ ํ๋ก์ธ์ค๋ผ๋ ์ ์ด๋ค. ํด๋ฌ์คํฐ๋ ๋ง์คํฐ ํ๋ก์ธ์ค์ ์์ปค ํ๋ก์ธ์ค๋ก ์ด๋ฃจ์ด์ ธ ์๋๋ฐ, ๋ง์คํฐ ํ๋ก์ธ์ค๋ CPU ๊ฐ์๋งํผ ์์ปค ํ๋ก์ธ์ค๋ฅผ ๋ง๋ค๊ณ , ์์ฒญ์ด ๋ค์ด์ค๋ฉด ๋ง๋ค์ด์ง ์์ปค ํ๋ก์ธ์ค์ ์์ฒญ์ ๋ถ๋ฐฐํ๋ค.
์ง์ cluster ๋ชจ๋๋ก ํด๋ฌ์คํฐ๋ง์ ๊ตฌํํ ์๋ ์์ง๋ง, ์ค๋ฌด์์๋ pm2์ ๋ชจ๋๋ก cluster์ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค. pm2๋ ๋์ค์, 15์ฅ์์ ์์๋ณด๋๋ก ํ์.
1. createServer๋ ์ธ์๋ก ___๊ณผ ___์ ๋ฃ๋๋ฐ, ์ด๋ ๊ฐ๊ฐ ___๊ณผ ___์ ๊ดํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค.
2. Header์ ํด๋นํ๋ ๋ฉ์๋๋ ____, Body์ ํด๋นํ๋ ๋ฉ์๋๋ ____์ด๋ค.
3. REST๋ฅผ ๋ฐ๋ฅด๋ ์๋ฒ๋ฅผ ____ํ๋ค๊ณ ํํํ๋ค.
4. req.method์์ ๊ตฌ๋ถํ๋ ๊ฒ์ ______์ด๋ค.
5. ์ฟ ํค์์ ํ๊ธ์ ์ฌ์ฉํ๊ณ ์ถ์ ๋๋ ___________๋ก ๊ฐ์ธ์ ๋ฃ๋๋ค.
6. ๋ ธ๋์์ http2 ๋ชจ๋์ ์ฌ์ฉํ๊ณ ์ถ์ ๋, https ๋ชจ๋์์ ____๋ฅผ http2๋ก, ____๋ฅผ createSecureServer ๋ฉ์๋๋ก ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
7. ํด๋ฌ์คํฐ๋ ___๊ฐ ์๋๋ผ ___๋ผ๋ ์ ์ ๊ธฐ์ตํด์ผ ํ๋ค.
1. 8083 ํฌํธ๋ก ์ฐ๊ฒฐ๋ ์๋ฒ๋ฅผ ๋ง๋ค์ด ๋ณด์์ค. ๋ด์ฉ์ผ๋ก๋ <h1>Hello Undefined!</h1>, <p>We are Undefined!</p>๊ฐ ๋ค์ด๊ฐ๊ฒ ํ์์ค.
2. method๊ฐ GET์ ์ํ๊ณ , url์ด /์ผ ๋ "./silsub.html"์ ๋ถ๋ฌ์ค๋ ์ฝ๋๋ฅผ ์์ฑํ์์ค.
1. req, res ์์ฒญ, ์๋ต
2. writeHead, write
3. RESTful
4. HTTP ์์ฒญ ๋ฉ์๋
5. encodeURIComponent
6. https, createServer
7. ์ค๋ ๋, ํ๋ก์ธ์ค
1.
const http = require('http');
http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8'});
res.write('<h1>Hello Undefined!</h1>');
res.end('<p>We are Undefined!</p>');
})
.listen(8083, () => {
console.log('8083์์ ๋๊ธฐ ์ค');
});
2.
if (req.method === "GET") {
if (req.url === "/") {
const data = await fs.readfile('./silsub.html');
res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
res.end(data);
}}
[Node.js] 6์ฅ ์ต์คํ๋ ์ค ์น ์๋ฒ ๋ง๋ค๊ธฐ (0) | 2022.11.05 |
---|---|
[Node.js] 5์ฅ ํจํค์ง ๋งค๋์ (0) | 2022.10.13 |
[Node.js] 3์ฅ ๋ ธ๋ ๊ธฐ๋ฅ (0) | 2022.09.29 |
[Node.js] 3์ฅ ๋ ธ๋ ๊ธฐ๋ฅ (0) | 2022.09.22 |
[Node.js] 2์ฅ ์์๋์ด์ผ ํ ์๋ฐ์คํฌ๋ฆฝํธ (0) | 2022.09.19 |