Nodejs REST
REST
: REpresentational State Transfer์ ์ค์๋ง์ด๋ฉฐ, ์๋ฒ์ ์์์ ์ ์ํ๊ณ ์์์ ๋ํ ์ฃผ์๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋ฅดํค๋ ๊ฒ, ์ผ์ข ์ ์ฝ์
REST์์๋ ์ฃผ์ ์ธ์๋ HTTP ์์ฒญ ๋ฉ์๋๋ผ๋ ๊ฒ์ ์ฌ์ฉํฉ๋๋ค.
- GET : ์๋ฒ ์์์ ๊ฐ์ ธ์ค๊ณ ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค. ์์ฒญ์ ๋ณธ๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ง ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๋ก ๋ณด๋ด์ผ ํ๋ค๋ฉด ์ฟผ๋ฆฌ์คํธ๋ง์ ์ฌ์ฉํฉ๋๋ค.
- POST : ์๋ฒ์ ์์์ ์๋ก ๋ฑ๋กํ๊ณ ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค. ์์ฒญ์ ๋ณธ๋ฌธ์ ์๋ก ๋ฑ๋กํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ๋ณด๋ ๋๋ค.
- PUT : ์๋ฒ์ ์์์ ์์ฒญ์ ๋ค์ด ์๋ ์์์ผ๋ก ์นํํ๊ณ ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค. ์์ฒญ์ ๋ณธ๋ฌธ์ ์นํํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด๋ณด๋ ๋๋ค.
- PATCH : ์๋ฒ ์์์ ์ผ๋ถ๋ง ์์ ํ๊ณ ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค. ์์ฒญ์ ๋ณธ๋ฌธ์ ์ผ๋ถ ์์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ๋ณด๋ ๋๋ค.
- DELECT : ์๋ฒ์ ์์์ ์ญ์ ํ๊ณ ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค. ์์ฒญ์ ๋ณธ๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ง ์์ต๋๋ค.
- OPTIONS : ์์ฒญ์ ํ๊ธฐ ์ ์ ํต์ ์ต์ ์ ์ค๋ช ํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
HTTP ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ๋๊ตฌ๋ ์๊ด์์ด ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ฒ์ ์ํตํ ์ ์์ต๋๋ค.
์ด ์๋ฏธ๋ ์ฆ ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ๋ถ๋ฆฌ๋์ด์๋ค๋ ์๋ฆฌ์ ๋๋ค. ์ถํ ํด๋ผ๋ฆฌ์ธํธ์ ๊ตฌ์ ๋์ง ์๋๋ค๋ ๋ป์ด๊ธฐ๋ ํฉ๋๋ค.
const http = require('http');
const fs = require('fs').promises;
const users = {}; // ๋ฐ์ดํฐ ์ ์ฅ์ฉ
http.createServer(async (req, res) => {
try {
if (req.method === 'GET') {
if (req.url === '/') {
const data = await fs.readFile('./restFront.html');
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
return res.end(data);
} else if (req.url === '/about') {
const data = await fs.readFile('./about.html');
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
return res.end(data);
} else if (req.url === '/users') {
res.writeHead(201, { 'Content-Type': 'application/json; charset=utf-8' });
return res.end(JSON.stringify(users)); // JSON๋ฅผ ๋ฌธ์์ด๋ก ๋ณํ
}
// /๋ /about๋ /users๋ ์๋๋ฉด
try {
const data = await fs.readFile(`.${req.url}`);
return res.end(data);
} catch (err) {
// ์ฃผ์์ ํด๋นํ๋ ๋ผ์ฐํธ๋ฅผ ๋ชป ์ฐพ์๋ค๋ 404 Not Found error ๋ฐ์
}
} else if (req.method === 'POST') {
if (req.url === '/user') {
let body = '';
// ์์ฒญ์ body๋ฅผ stream ํ์์ผ๋ก ๋ฐ์
req.on('data', (data) => { // .push ์ด์ฉ์ ๋ฒํผํ์์ผ๋ก ์ฌ์ฉํ๊ณ end์์ ๋ฌธ์์ด์ ํฉ์ณ์ ์ฌ์ฉ
body += data; // ์ฌ๊ธฐ์ ์ด๋ฏธ ์คํธ๋ฆฌ๋ฐํ์์ผ๋ก ํฉ์นจ
});
// ์์ฒญ์ body๋ฅผ ๋ค ๋ฐ์ ํ ์คํ๋จ
return req.on('end', () => {
console.log('POST ๋ณธ๋ฌธ(Body):', body);
const { name } = JSON.parse(body); // ๋ฌธ์์ด์ JSON์ผ๋ก ๋ณํ
// { name } : ๋์ค๋ญ์ณ๋ง : body.name์ ๋ฃ์ด์ค๊ฒ
const id = Date.now(); //์ง๊ธ์๊ฐ
users[id] = name; //์ธ๋ฑ์ค๊ฐ์ ํค:๊ฐ์ฒ๋ผ ์ด์ฉํ๊ฒ
res.writeHead(201, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end('ok');
});
}
} else if (req.method === 'PUT') {
if (req.url.startsWith('/user/')) {
const key = req.url.split('/')[2]; // ๋ฌธ์์ด์ ๋๋ ์ ๋๋ฒ์งธ ์ธ๋ฑ์ค๊ฐ์ ๊ฐ์ ธ์จ๋ค๋ ๊ฒ
let body = ''; // ๋ณ์ ์ด๊ธฐํ
req.on('data', (data) => {
body += data;
});
return req.on('end', () => {
console.log('PUT ๋ณธ๋ฌธ(Body):', body);
users[key] = JSON.parse(body).name; // ์์์ ๋๋ ์ ๋ฃ์ ๊ฒ์ ํ๋ฒ์ ๋ฃ์ ๊ฒ์ ๋ณด์ฌ์ค.
res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
return res.end('ok');
});
}
} else if (req.method === 'DELETE') {
if (req.url.startsWith('/user/')) { // ์์ ๋ฌธ์์ด๋ค์ด ๋ง๋ค๋ฉด
const key = req.url.split('/')[2];
delete users[key];
res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
return res.end('ok');
}
}
res.writeHead(404); // ์์์ ์๋ฌด๊ฒ๋ ํด๋นํ์ง ์์์ ๊ฒฝ์ฐ NOT FOUND์๋ฌ
return res.end('NOT FOUND');
} catch (err) {
console.error(err);
res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end(err.message);
}
})
.listen(8082, () => {
console.log('8082๋ฒ ํฌํธ์์ ์๋ฒ ๋๊ธฐ ์ค์
๋๋ค');
});
์์ ์ฝ๋์ ์ฃผ์๋ฌธ์ ๊ฑฐ์๋ค ์ ์ด๋์์ง๋ง ์กฐ๊ธ๋ ์ค๋ช ์ ํด๋ณด๊ฒ ์ต๋๋ค.
req.method
๋ก HTTP์์ฒญ ๋ฉ์๋๋ฅผ ๊ตฌ๋ถํ๊ณ , req.url
๋ก ์์ฒญ์ฃผ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค.
๋ ๋ค๋ฅธ HTTP์์ฒญ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ผ๋ฉด else if๋ฅผ ํตํด ์ฌ์ฉ์ ํ๋ฉด๋ฉ๋๋ค.
res.end ์์ return์ด ์๋ ์ด์ ๋ ํจ์๋ฅผ ์ข ๋ฃ์ํค๊ธฐ ์ํด์ ์ ๋๋ค.
users ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ฅํ์ต๋๋ค.
stream์ผ๋ก ๋์ด์๋ ๋ฐ์ดํฐ๋ ์คํธ๋ฆผ ํ์์ผ๋ก ์ ๋ฌ๋๋ฉฐ, on์ ํตํด ๋ฐ์ ๋ฐ์ดํฐ๋ ๋ฌธ์์ด์ด๋ฏ๋ก JSON.parseํ๋ ๊ณผ์ ์ด ํ์ํฉ๋๋ค.
Leave a comment