์์ํ๊ธฐ์ ์์, nodemon๊ณผ serve๋ผ๋ ๋๊ตฌ์ ๋ํด ์์๋ณด์.
nodemon
: Node.js ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋, ํ์ผ์ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋์ผ๋ก ์ฌ์คํ์์ผ์ฃผ๋ ๋ชจ๋
โก๏ธ ์๋ ํ์ผ์ด ์์ ๋ ๋๋ง๋ค ์๋ฒ๋ฅผ ์ฌ์คํ์์ผ์ค์ผ ํ๋๋ฐ, ์ด๋ฅผ ์๋์ผ๋ก ํด์ค๋ค.
nodemonnodemon์ผ๋ก ์๋ฒ ์คํ ๋ฐฉ๋ฒ 1 - npm
- nodemon์ ์ค์นํ๋ค.
npm install nodemon
- package.json ํ์ผ์ "script"์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๊ณ ,
npm start
๋ช ๋ น์ด๋ก ์๋ฒ๋ฅผ ์คํํ๋ค."start": "nodemon server.js"
nodemon์ผ๋ก ์๋ฒ ์คํ ๋ฐฉ๋ฒ 2 - npx
npx nodemon
๋ช ๋ น์ด๋ก ์๋ฒ ํ์ผ์ ์คํํ๋ค.npx nodemon server.js
serve
: ํน์ ํฌํธ์์ ํด๋ผ์ด์ธํธ๋ฅผ ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ๋ชจ๋
# client/index.html๋ฅผ ํฌํธ ๋ฒํธ 80์์ ์คํํ๋ค. npx serve -l 80 client/
๋ธ๋ผ์ฐ์ ์๋ fetch
์ ๊ฐ์ด HTTP ์์ฒญ์ ๋ณด๋ด๋ ๋๊ตฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ๋์ด ์๋ค.
์๋ฒ๋ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์ HTTP ์์ฒญ์ ๋ง๊ฒ ์๋ต์ ๋ณด๋ผ ์ ์๋๋ก ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค.
โก๏ธ ์ด๋ ๊ฒ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ๋ณด๋ด์ฃผ๋ ํ๋ก๊ทธ๋จ์ ์น ์๋ฒ๋ผ๊ณ ํ๋ค.
: HTTP ์์ฒญ๊ณผ ์๋ต์ ๋ค๋ฃจ๋ ์น ์๋ฒ๋ฅผ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๋ ๋ชจ๋
const http = require("http");
createServer()
๋ชจ๋ node ์น ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์
์ ์น ์๋ฒ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
createServer()
๋ฉ์๋๋ฅผ ์ด์ฉํด์ ์น ์๋ฒ ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.
const server = http.createServer((request, response) => {
// ์์ฒญ ํธ๋ค๋ง
});
createServer()
ํจ์๊ฐ ํธ์ถ๋๋ค.createServer()
์ ์ฝ๋ฐฑ ํจ์์ request
์ response
๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ฉฐ, ์์ฒญ ํธ๋ค๋ฌ ํจ์๋ฅผ ํธ์ถํ๋ค.listen()
๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํ๋ค.server.listen()
listen()
๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ ์๋ฒ์์ ์ฌ์ฉํ๊ณ ์ ํ๋ ํฌํธ ๋ฒํธ๋ฅผ ์ ๋ฌ์ธ์๋ก ์ ๋ฌํ๋ค.
server.listen(4999);
์๋์ฒ๋ผ ๋ค๋ฅธ ์ ๋ฌ์ธ์๋ ํจ๊ป ์ ๋ฌํ ์ ์๋ค.
const PORT = 4999;
const ip = 'localhost';
...
server.listen(PORT, ip, () => {
console.log(`Server is Running at ${ip}:${PORT}`);
// Server is Running at localhost:4999
});
request.method
& request.url
์์ฒญ์ ์ฒ๋ฆฌํ ๋, ์ฐ์ ๋ฉ์๋์ URL์ ํ์ธํ ํ, ์ด์ ๋ํ ์ ์ ํ ์์
์ ์คํํ๋ฉด ๋๋ค.
request
๊ฐ์ฒด์ method
, url
ํ๋กํผํฐ์ ์ ๊ทผํ์ฌ ์์ฒญ์ HTTP ๋ฉ์๋์ URL์ ํ์ธํ ์ ์๋ค.
request.method
: HTTP ๋ฉ์๋/๋์ฌrequest.url
: ์ ์ฒด URL์์ ์๋ฒ, ํ๋กํ ์ฝ, ํฌํธ๋ฅผ ์ ์ธํ ๊ฒ์ผ๋ก, ์ธ ๋ฒ์งธ ์ฌ๋์ ์ดํ์ ๋๋จธ์ง ์ ๋ถrequest.headers
request
๊ฐ์ฒด์ headers
๊ฐ์ฒด๋ฅผ ํตํด ์์ฒญ์ ํค๋์ ์ ๊ทผํ ์ ์๋ค.
console.log(request.headers);
// ํค๋ ๊ฐ์ฒด๊ฐ ์ถ๋ ฅ๋๋ค. {...}
console.log(request.headers['user-agent']);
// ํค๋ ๊ฐ์ฒด์ user-agent ์์ฑ์ ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
// Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36
'data'
& 'end'
์ด๋ฒคํธPOST๋ PUT ์์ฒญ์ ๋ฐ์ ๋๋, ์์ฒญ ๋ฐ๋์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ผ ํ๋ค.
request
๊ฐ์ฒด๋ ReadableStream ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๋๋ฐ, ์ด ์คํธ๋ฆผ์ 'data'
์ 'end'
์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ์ ์๋ค.
let body = [];
request.on('data', (chunck) => { // 'data' ์ด๋ฒคํธ ๋ฆฌ์ค๋
body.push(chunck);
}).on('end', () => { // 'end' ์ด๋ฒคํธ ๋ฆฌ์ค๋
body = Buffer.concat(body).toString();
// body์ ์์ฒญ ๋ฐ๋ ์ ์ฒด๊ฐ ๋ด๊ธด๋ค.
});
'data'
์ด๋ฒคํธ๋ ์ฒญํฌ(chunck)๋ฅผ ๋ฐ์์ํค๊ณ , ์ด ์ฒญํฌ๋ ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ Buffer ๊ฐ์ฒด์ด๋ค.'end'
์ด๋ฒคํธ์์ Buffer์ ์ด์ด ๋ถ์ธ ๋ค์,toString()
๋ฉ์๋๋ฅผ ์ด์ฉํด ๋ฌธ์์ด๋ก ๋ณํํ๋ค.body
์๋ ์์ฒญ ๋ฐ๋์ ๋ฐ์ดํฐ๊ฐ ๋ฌธ์์ด๋ก ๋ด๊ธฐ๊ฒ ๋๋ค.Buffer ๊ฐ์ฒด
๋ฒํผ ํํ์ ๋ฐ์ดํฐ๋ฅผ ์๋์ ๋ฌธ์๋ก ๋ค์ ๋ฐ๊พธ๋ ค๋ฉด
toString()
๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค.data.toString()
response.statusCode
HTTP ์ํ ์ฝ๋๋ฅผ ๋ฐ๋ก ์ค์ ํ์ง ์์ผ๋ฉด, HTTP ์ํ ์ฝ๋๋ ํญ์ 200์ด๋ค.
์๋ต์ HTTP ์ํ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด response
๊ฐ์ฒด์ statusCode
ํ๋กํผํฐ๋ฅผ ์ค์ ํ๋ฉด ๋๋ค.
response.statusCode = 404;
// 404 Not Found, ํด๋ผ์ด์ธํธ์๊ฒ ๋ฆฌ์์ค๋ฅผ ์ฐพ์ ์ ์๋ค๊ณ ์๋ ค์ค๋ค.
response.setHeader()
response
๊ฐ์ฒด์ setHeader()
๋ฉ์๋๋ก ํค๋๋ฅผ ์ค์ ํ ์ ์๋ค.
response.setHeader('Content-Type', 'application/json');
response.setHeader('X-Powered-By', 'bacon');
response.writeHead()
๋ช
์์ ์ผ๋ก ์๋ต ์คํธ๋ฆผ์ ํค๋๋ฅผ ์์ฑํ๊ณ ์ถ๋ค๋ฉด writeHead()
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์ํ ์ฝ๋์ ํค๋๋ฅผ ์์ฑํ๋ค.
response.writeHead(200, {
'Content-Type': 'application/json',
'X-Powered-By': 'bacon'
});
โก๏ธ ํค๋๋ฅผ ์์ฑํ๊ณ ๋๋ฉด, ์๋ต ๋ฐ๋(๋ฐ์ดํฐ)๋ฅผ ์ ์กํ ์ ์๋ค.
์ฃผ์ํ ์ โ๏ธ ์๋ต ๋ฐ๋์ ๋ฐ์ดํฐ ์ฒญํฌ๋ฅผ ์์ฑํ๊ธฐ ์ ์๋ ํญ์ ์ํ ์ฝ๋์ ํค๋๋ฅผ ์ค์ ํด์ผ ํ๋ค.
response.write()
response
๊ฐ์ฒด๋ WritableStream์ด๋ฏ๋ก, ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด๋ ์๋ต ๋ฐ๋๋ ์ผ๋ฐ์ ์ธ ์คํธ๋ฆผ ๋ฉ์๋ write()
๋ฅผ ์ฌ์ฉํด์ ์์ฑํ๋ค.
response.write('<html>'); // ์๋ต ๋ฐ๋ ์์ฑ
response.write('<body>');
response.write('<h1>Hello, World!</h1>');
response.write('</body>');
response.write('</html>');
response.end(); // ์๋ต ์ข
๋ฃ
response.end()
๋ฉ์๋๋ ๋ฐ๋์ ์๋ต๋ง๋ค ํธ์ถ๋์ด์ผ ํ๋ค.
response.end()
response.end()
์์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ฉด, response.write(data)
๋ฅผ ํธ์ถํ ๋ค์์ response.end()
๋ฅผ ํธ์ถํ ๊ฒ๊ณผ ๊ฐ๋ค.
response.end(<html><body><h1>Hello, World!</h1></body></html>);
// ์๋ต ๋ฐ๋๋ฅผ ์์ฑํ๊ณ ์ข
๋ฃ
ํด๋ผ์ด์ธํธ์์ ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ(preflight request)์ ๋ณด๋ด๋ฉด, ์๋ต ํค๋์ CORS๋ฅผ ์ค์ ํ๋ ํค๋๋ฅผ ๋ฃ์ด์ ์๋ตํ๋ค.
// CORS ์ค์ ํค๋
const defaultCorsHeader = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Accept',
'Access-Control-Max-Age': 10
};
if(request.method === 'OPTIONS') {
response.writeHead(200, defaultCorsHeader); // ์๋ต ํค๋ ์์ฑ
response.end(); // ์๋ต ์ข
๋ฃ
return; // if๋ฌธ ์ข
๊ฒฐ์ํค๊ธฐ
}
ํด๋ผ์ด์ธํธ์์ ํ
์คํธ๋ฅผ ์
๋ ฅํ ํ,
upper
๋ฒํผ์ ๋๋ฅด๋ฉด ํ
์คํธ๋ฅผ ๋๋ฌธ์๋ก ๋ณํ์์ผ์ฃผ๊ณ ,
lower
๋ฒํผ์ ๋๋ฅด๋ฉด ํ
์คํธ๋ฅผ ์๋ฌธ์๋ก ๋ณํ์์ผ์ฃผ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์๋ฒ
const http = require('http');
const PORT = 4999;
const ip = 'localhost';
// CORS ์ค์ ํค๋
const defaultCorsHeader = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Accept',
'Access-Control-Max-Age': 10
};
// ์๋ฒ ์์ฑ
const server = http.createServer((request, response) => {
let body = [];
// ๋ชจ๋ ์๋ต์ ํค๋์ CORS ์ค์ ํค๋ ์์ฑ
response.writeHead(200, defaultCorsHeader);
// POST ์์ฒญ + url์ด /upper ์ผ๋
if(request.method === 'POST' && request.url === '/upper') {
request.on('data', (chunck) => {
body.push(chunck);
}).on('end', () => {
body = Buffer.concat(body).toString().toUpperCase();
response.end(body);
});
// POST ์์ฒญ + url์ด /lower ์ผ๋
} else if(request.method === 'POST' && request.url === '/lower') {
request.on('data', (chunck) => {
body.push(chunck);
}).on('end', () => {
body = Buffer.concat(body).toString().toLowerCase();
response.end(body);
});
// ๊ทธ ์ธ์ ์์ฒญ์ ์๋ฌ ์ฒ๋ฆฌ
} else {
response.statusCode = 404;
response.end('404 Not Found');
}
});
// ์๋ฒ ์คํ
server.listen(PORT, ip, () => {
console.log(`Server is Running at ${ip}:${PORT}`);
});
๋์ค์ ์ฝ์ด๋ณด๋ฉด ์ข์ ๊ธ
https://leejabba.gitbooks.io/node-js/content/http-baa8-b4c8.html#3
https://jongik.tistory.com/31
โ ํ์ต ํ ๊ถ๊ธํ ์
- serve ๋ชจ๋์ด ์ ํํ ๋ฌด์์ธ์ง ์ ๋๋ก ์ดํดํ์ง ๋ชปํ๋ค.
- ReadableStream, WritableStream ์ด๋?
- ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ฌ์ฉํ ๋
.on()
์ ์ด์ฉํ๋ ๊ฑด์ง?- ์์ฒญ/์๋ต ํค๋์ ์ด๋ค ๋ด์ฉ๋ค์ด ์๋์ง ๊ณต๋ถํ๊ณ ๋ธ๋ก๊น ํ๊ธฐ ๐