[๋ ธ๋ 2ํ] #6. http ๋ชจ๋๋ก ์๋ฒ ๋ง๋ค๊ธฐ & ํจํค์ง ๋งค๋์
๐ํค์๋: ์์ฒญ๊ณผ ์๋ต, REST, ์ฟ ํค, ์ธ์ , https, cluster, npm, package.json
์๋ฒ์๋ ์์ฒญ์ ๋ฐ๋ ๋ถ๋ถ๊ณผ ์๋ต์ ๋ณด๋ด๋ ๋ถ๋ถ์ด ์์ด์ผ ํ๋ค.
์์ฒญ & ์๋ต์ ์ด๋ฒคํธ ๋ฐฉ์์ด๋ฏ๋ก, ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ฏธ๋ฆฌ ๋ฑ๋กํด๋ฌ์ผํ๋ค.
โ
๋ ธ๋ ์๋ฒ๋ฅผ ๋ง๋๋ ์ฝ๋
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๋ฒ ํฌํธ์์ ์๋ฒ ๋๊ธฐ ์ค์
๋๋ค!');
});
res ๊ฐ์ฒด์๋ res.writeHead, res.write, res.end ๋ฉ์๋๊ฐ ์๋ค.
→ res.writeHead๋ ์๋ต์ ๋ํ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ ๋ฉ์๋์ด๋ค. ์ฒซ ๋ฒ์งธ ์ธ์๋ก๋ ์ฑ๊ณต์ ์ธ ์์ฒญ์์ ์๋ฏธํ๋ 200์, ๋ ๋ฒ์งธ ์ธ์๋ก๋ ์๋ต์ ๋ํ ์ ๋ณด๋ฅผ ๋ณด๋ธ๋ค.
→ res.write์๋ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ผ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ค๋ค.
→ res.end๋ ์๋ต์ ์ข ๋ฃํ๋ ๋ฉ์๋์ด๋ค.
โ
์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด์ด http://localhost:8080์ ์ ์ํ๋ฉด, ์์ ์๋ฒ๋ก ์ด๋ํ๋ค.
์๋ฒ๋ฅผ ์ข ๋ฃํ๋ ค๋ฉด ์ฝ์์์ Ctrl+C๋ฅผ ์ ๋ ฅํ๋ฉด ๋๋ค.
*REST: ์๋ฒ์ ์์์ ์ ์ํ๊ณ , ์์์ ๋ํ ์ฃผ์๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ
→ HTTP ์์ฒญ ๋ฉ์๋ ์ค ์์ฃผ ์ฌ์ฉ๋๋ ๋ฉ์๋
• GET: ์๋ฒ ์์์ ๊ฐ์ ธ์ค๊ณ ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค. ์์ฒญ์ ๋ณธ๋ฌธ(body)์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ง ์๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๋ก ๋ณด๋ด์ผ ํ๋ค๋ฉด ์ฟผ๋ฆฌ์คํธ๋ง์ ์ฌ์ฉํ๋ค.
• POST: ์๋ฒ์ ์์์ ์๋ก ๋ฑ๋กํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค. ์์ฒญ์ ๋ณธ๋ฌธ์ ์๋ก ๋ฑ๋กํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ๋ณด๋ธ๋ค.
• PUT: ์๋ฒ์ ์์์ ์์ฒญ์ ๋ค์ด ์๋ ์์์ผ๋ก ์นํํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค. ์์ฒญ์ ๋ณธ๋ฌธ์ ์นํํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ๋ณด๋ธ๋ค.
• PATCH: ์๋ฒ ์์์ ์ผ๋ถ๋ง ์์ ํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค. ์์ฒญ์ ๋ณธ๋ฌธ์ ์ผ๋ถ ์์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ๋ณด๋ธ๋ค.
• DELETE: ์๋ฒ์ ์์์ ์ญ์ ํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค. ์์ฒญ์ ๋ณธ๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ง ์๋๋ค.
• OPTIONS: ์์ฒญ์ ํ๊ธฐ ์ ์ ํต์ ์ต์ ์ ์ค๋ช ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
- REST ์๋ฒ๋ ๋ฐ์ดํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ฏ๋ก ์๋ฒ๋ฅผ ์ข ๋ฃํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์์ค๋๋ค.
'๋ฐ์ดํฐ๋ฒ ์ด์ค'๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์๊ตฌ์ ์ผ๋ก ์ ์ฅํ ์ ์๋ค.
โ
- ์ฌ์ฉ์๊ฐ ๋๊ตฌ์ธ์ง ๊ธฐ์ตํ๊ธฐ ์ํด ์๋ฒ๋ ์์ฒญ์ ๋ํ ์๋ต์ ํ ๋ ์ฟ ํค๋ฅผ ๊ฐ์ด ๋ณด๋ธ๋ค.
- ์ฟ ํค๋ ์ ํจ ๊ธฐ๊ฐ์ด ์๋ค.
- name = zerocho์ ๊ฐ์ด ๋จ์ํ 'ํค-๊ฐ'์ ์
- ์๋ฒ๋ ๋ฏธ๋ฆฌ ํด๋ผ์ด์ธํธ์ ์์ฒญ์๋ฅผ ์ถ์ ํ ๋งํ ์ ๋ณด๋ฅผ ์ฟ ํค๋ก ๋ง๋ค์ด ๋ณด๋ด๊ณ , ๊ทธ๋ค์๋ถํฐ๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ฟ ํค๋ฅผ ๋ฐ์ ์์ฒญ์ ํ์
์ฟ ํค๋ฅผ ๋ง๋ค์ด ์์ฒญ์์ ๋ธ๋ผ์ฐ์ ์ ๋ฃ๋ ์ฝ๋
const http = require("http");
http.createServer((req, res) => {
console.log(req.url, req.headers.cookie);
res.writeHead(200, {'Set-Cookie' : 'mycookie=test'});
res.end('Hello Cookie');
}).listen(8083, () => {
console.log("8083๋ฒ ํฌํธ์์ ์๋ฒ ๋๊ธฐ ์ค์
๋๋ค!");
});
→ createServer ๋ฉ์๋์ ์ฝ๋ฐฑ์์๋ req ๊ฐ์ฒด์ ๋ด๊ฒจ ์๋ ์ฟ ํค๋ฅผ ๊ฐ์ ธ์จ๋ค.
(์ฟ ํค๋ req.headers.cookie์ ๋ค์ด์๋ค.)
→ res.writeHead ๋ฉ์๋๋ฅผ ํตํด ์๋ต ํค๋์ ์ฟ ํค ๊ธฐ๋ก
→ Set-Cookie๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค์ ๊ฐ๊ณผ ๊ฐ์ ์ฟ ํค๋ฅผ ์ ์ฅํ๋๋ก ํ๋ค.
→ ์๋ต์ ๋ฐ์ ๋ธ๋ผ์ฐ์ ๋ mycookie=test๋ผ๋ ์ฟ ํค๋ฅผ ์ ์ฅ
โป ๋ฏผ๊ฐํ ๊ฐ์ธ์ ๋ณด๋ฅผ ์ฟ ํค์ ๋ฃ์ด๋๋ ๊ฒ์ ์ ์ ํ์งX
์ฟ ํค์ ์ด๋ฆ์ ๋ด์์ ๋ณด๋ด๋ ๋์ , uniqueInt๋ผ๋ ์ซ์ ๊ฐ์ ๋ณด๋ด๊ณ ์ฌ์ฉ์์ ์ด๋ฆ & ๋ง๋ฃ ์๊ฐ์ uniqueInt ์์ฑ๋ช ์๋์ ์๋ session์ด๋ผ๋ ๊ฐ์ฒด์ ๋์ ์ ์ฅํ๋ค.
- https ๋ชจ๋์ ์น ์๋ฒ์ SSL ์ํธํ๋ฅผ ์ถ๊ฐํ์ฌ GET์ด๋ POST ์์ฒญ์ ํ ๋ ์ค๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ํธํํด์ ์ค๊ฐ์ ๋ค๋ฅธ ์ฌ๋์ด ์์ฒญ์ ๊ฐ๋ก์ฑ๋๋ผ๋ ๋ด์ฉ์ ํ์ธํ ์ ์๊ฒ ํ๋ค.
ex) ๋ก๊ทธ์ธ, ๊ฒฐ์ ๊ฐ ํ์ํ ์ฐฝ์์ https ์ํธํ ์ ์ฉ ํ์
โ
*cluster ๋ชจ๋: ์ฑ๊ธ ํ๋ก์ธ์ค๋ก ๋์ํ๋ ๋ ธ๋๊ฐ CPU ์ฝ์ด๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๋ชจ๋
- ํฌํธ๋ฅผ ๊ณต์ ํ๋ ๋ ธ๋ ํ๋ก์ธ์ค๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ ์ ์์ด, ์์ฒญ์ด ๋ง์ด ๋ค์ด์์ ๋ ์์ฒญ์ ๋ถ์ฐ์ํฌ ์ ์๋ค.
→ ์๋ฒ์ ๋ฌด๋ฆฌ๊ฐ ๋ ๊ฐ๋ ํจ๊ณผ
- ๋ ธ๋๋ ๋ณดํต ์ฝ์ด๋ฅผ ํ๋๋ง ํ์ฉํ๋๋ฐ, ํด๋ฌ์คํฐ๋ง์ ํ๋ฉด ์ฝ์ด๋ฅผ ํ๋๋ง ํ์ฉํ ๋์ ๋นํด ์ฑ๋ฅ์ด ๊ฐ์ ๋๋ค.
- ํด๋ฌ์คํฐ๋ง์ ์ ์ฉํด๋๋ฉด ์๊ธฐ์น ๋ชปํ ์๋ฌ๋ก ์ธํด ์๋ฒ๊ฐ ์ข ๋ฃ๋๋ ํ์์ ๋ฐฉ์งํ ์ ์๋ค.
โ
์์ '์ฃผ์ 1.์์ฒญ๊ณผ ์๋ต'์์ ๋์๋ ๋ ธ๋ ์๋ฒ ์์ ์ฝ๋๋ฅผ ํด๋ฌ์คํฐ๋งํ ์ฝ๋
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`๋ง์คํฐ ํ๋ก์ธ์ค ์์ด๋: ${process.pid}`);
// CPU ๊ฐ์๋งํผ ์์ปค๋ฅผ ์์ฐ
for (let i = 0; i < numCPUs; i += 1) {
cluster.fork();
}
// ์์ปค๊ฐ ์ข
๋ฃ๋์์ ๋
cluster.on('exit', (worker, code, signal) => {
console.log(`${worker.process.pid}๋ฒ ์์ปค๊ฐ ์ข
๋ฃ๋์์ต๋๋ค.`);
console.log('code', code, 'signal', signal);
});
} else {
// ์์ปค๋ค์ด ํฌํธ์์ ๋๊ธฐ
http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.write('<h1>Hello Node!</h1>');
res.end('<p>Hello Cluster!</p>');
}).listen(8086);
console.log(`${process.pid}๋ฒ ์์ปค ์คํ`);
}
*npm = ๋ ธ๋ ํจํค์ง ๋งค๋์
- ๋๋ถ๋ถ์ jsํ๋ก๊ทธ๋จ์ ํจํค์ง ์ด๋ฆ์ผ๋ก npm์ ๋ฑ๋ก๋์ด ์๋ค.
- ํน์ ๊ธฐ๋ฅ์ ํ๋ ํจํค์ง๊ฐ ํ์ํ๋ค๋ฉด npm์์ ์ฐพ์ ์ค์นํ๋ฉด ๋๋ค.
โ
โ
โ
*package.json: ์ค์นํ ํจํค์ง์ ๋ฒ์ ์ ๊ด๋ฆฌํ๋ ํ์ผ
โ ๋ ธ๋ ํ๋ก์ ํธ๋ฅผ ์์ํ๊ธฐ ์ ์๋ ํด๋ ๋ด๋ถ์ ๋ฌด์กฐ๊ฑด package.json๋ถํฐ ๋ง๋ค๊ณ ์์ํด์ผ ํ๋ค.
- ํจํค์ง๋ค์ ์์กด ๊ด๊ณ๊ฐ ๋ณต์กํ๊ฒ ์ฝํ ์๊ธฐ ๋๋ฌธ์ ํ์ํ๋ค.
- npm init ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ pacakge.json์ ๋ง๋ค ์ ์๋ค.
$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help json` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
package name: (ํด๋๋ช
) [ํ๋ก์ ํธ ์ด๋ฆ ์
๋ ฅ]
version: (1.0.0) [ํ๋ก์ ํธ ๋ฒ์ ์
๋ ฅ]
description: [ํ๋ก์ ํธ ์ค๋ช
์
๋ ฅ]
entry point: index.js
test command: [์ํฐ ํค ํด๋ฆญ]
git repository: [์ํฐ ํค ํด๋ฆญ]
keywords: [์ํฐ ํค ํด๋ฆญ]
author: [์ฌ๋ฌ๋ถ์ ์ด๋ฆ ์
๋ ฅ]
license: (ISC) [์ํฐ ํค ํด๋ฆญ]
About to write to C:\Users\zerocho/npmtest\package.json:
//...์๋ต
1. ์๋ฒ์ ์์์ ์ ์ํ๊ณ ์์์ ๋ํ ์ฃผ์๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ( ) ๋ผ๊ณ ํ๋ค.
โ
2. ์ฌ์ฉ์๊ฐ ๋๊ตฌ์ธ์ง ๊ธฐ์ตํ๊ธฐ ์ํด ์๋ฒ๋ ์์ฒญ์ ๋ํ ์๋ต์ ํ ๋ ( )๋ฅผ ๊ฐ์ด ๋ณด๋ธ๋ค.
โ
3. ์ฟ ํค์ ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ด์์ ๋ณด๋ด๋ ๊ฒ์ ๋ณด์์ ์ทจ์ฝํ๋ฏ๋ก, ์ฌ์ฉ์์ ์ด๋ฆ๊ณผ ๋ง๋ฃ ์๊ฐ์ ์ฟ ํค ๋์ ( ) ๊ฐ์ฒด์ ๋์ ์ ์ฅํ๋ค.
โ
4. https ๋ชจ๋์ ( ) ์ํธํ๋ฅผ ํตํด ์ค๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ค๊ฐ์ ๋ค๋ฅธ ์ฌ๋์ด ๊ฐ๋ก์ฑ๋๋ผ๋ ๊ทธ ๋ด์ฉ์ ํ์ธํ ์ ์๊ฒ ํ๋ค.
โ
5. ํฌํธ๋ฅผ ๊ณต์ ํ๋ ๋ ธ๋ ํ๋ก์ธ์ค๋ฅผ ์ฌ๋ฌ ๊ฐ ๋์ด ์์ฒญ์ ๋ถ์ฐ์ํฌ ์ ์๋ ๋ชจ๋์ ( ) ์ด๋ค.
6. ํน์ ๊ธฐ๋ฅ์ ํ๋ ํจํค์ง๊ฐ ํ์ํ๋ค๋ฉด ( ) ์์ ์ฐพ์ ์ค์นํ๋ฉด ๋๋ค.
7. ์ค์นํ ํจํค์ง์ ๋ฒ์ ์ ๊ด๋ฆฌํ๋ ํ์ผ์ ( ) ์ด๋ค.
8. http ๋ชจ๋์ ์ฌ์ฉํ์ฌ HTTP ์๋ฒ๋ฅผ ์์ฑํ์์ค. ์๋ฒ๋ 8081๋ฒ ํฌํธ์์ ์คํ๋๋ค.
โ
9. ์ฟ ํค๋ฅผ ๋ง๋ค์ด ๋ธ๋ผ์ฐ์ ์ ๋ฃ๋ ์ฝ๋์ด๋ค. 1~4๋ฒ ์ฃผ์์ ์ฑ์ฐ์์ค.
const http = require("http");
http.createServer((//1๋ฒ, res) => {
console.log(//2๋ฒ, //3๋ฒ);
res.writeHead(200, {//4๋ฒ : 'mycookie=test'});
res.end('Hello Cookie');
}).listen(8083, () => {
console.log("8083๋ฒ ํฌํธ์์ ์๋ฒ ๋๊ธฐ ์ค์
๋๋ค!");
});
1. REST
2. ์ฟ ํค
3. session
4. SSL
5. cluster
6. npm
7. package.json
8.
const http = require('http');
http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.write('<h1>http ๋ชจ๋์ ์ฌ์ฉํ HTTP ์๋ฒ</h1>');
res.end('<p>8081๋ฒ ํฌํธ์์ ์คํ๋๋ ์๋ฒ</p>');
})
.listen(8081, () => {
console.log('8081๋ฒ ํฌํธ์์ ์๋ฒ ๋๊ธฐ ์ค');
});
9.
const http = require("http");
http.createServer((req, res) => {
console.log(req.url, req.headers.cookie);
res.writeHead(200, {'Set-Cookie' : 'mycookie=test'});
res.end('Hello Cookie');
}).listen(8083, () => {
console.log("8083๋ฒ ํฌํธ์์ ์๋ฒ ๋๊ธฐ ์ค์
๋๋ค!");
});
์ถ์ฒ) ์กฐํ์ , ใNode.js ๊ต๊ณผ์ ๊ฐ์ 3ํใ, ๊ธธ๋ฒ(2022), 4์ฅ-5์ฅ
Corner node.js 2ํ
Editor : Pujimbao
[๋ ธ๋ 2ํ] #8. MySQL (3) | 2024.11.29 |
---|---|
[๋ ธ๋ 2ํ] #7. ์ต์คํ๋ ์ค ์น ์๋ฒ ๋ง๋ค๊ธฐ (0) | 2024.11.22 |
[๋ ธ๋ 2ํ] #5. ๋ ธ๋ ๊ธฐ๋ฅ(2) (0) | 2024.11.08 |
[๋ ธ๋ 2ํ] #4.๋ ธ๋ ๊ธฐ๋ฅ ์์๋ณด๊ธฐ(1) (0) | 2024.10.11 |
[๋ ธ๋ 2ํ] #3.์์๋ฌ์ผ ํ ์๋ฐ์คํฌ๋ฆฝํธ (0) | 2024.10.11 |