์ค๋์ Express์์ REST API์ DELETE์ PUT ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ์ ํ๋ฒ ์ ๋ณด๋ฅผ ์ญ์ ํ๊ณ ์์ ํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ๋ค. ๋๋์ด CRUD๋ฅผ ์ ๋ถ ํ๋ฒ์ฉ ์์ฑํด๋ด
๐๏ธDELETE
๊ฐ๋ณ ์ ํ๋ฒ ์ญ์
DELETE /youtubers/:id
- req: params.id
- res: "์ญ์ ๋์์ต๋๋ค."
app.delete("/youtubers/:id", function (req, res) {
const { id } = req.params;
if (db.get(parseInt(id)) == undefined) {
res.json({ message: "์กด์ฌํ์ง ์๋ ์ฑ๋์
๋๋ค" });
} else {
db.delete(parseInt(id));
res.json({ message: "์ญ์ ๋์์ต๋๋ค" });
}
});
req.params
์์id
๋ฅผ ๊ฐ์ ธ์ ์ญ์ ํ ๋์์ ์ง์ ํ๋ค.- ์กด์ฌํ์ง ์๋
id
์ธ ๊ฒฝ์ฐ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค. db.delete()
๋ฉ์๋๋ก Map์์ ํด๋น ํค๋ฅผ ์ ๊ฑฐํ๋ค.
โญ Map์์ id๋ฅผ ์ฐพ์ ์ ์๊ฒ ParseInt()๋ก ๋ณํ!


์ ์ฒด ์ ํ๋ฒ ์ญ์
DELETE /youtubers
- req: x
- res: "๋ชจ๋ ์ฑ๋์ด ์ญ์ ๋์์ต๋๋ค"
app.delete("/youtubers", function (req, res) {
var message = "";
if (db.size >= 1) {
db.clear();
message = "๋ชจ๋ ์ฑ๋์ด ์ญ์ ๋์์ต๋๋ค";
} else {
message = "์ฑ๋์ด ์กด์ฌํ์ง ์์ต๋๋ค";
}
res.json({ message: message });
});
- ๊ฒฝ๋ก๊ฐ /youtubers์ธ DELETE ์์ฒญ์ ์ฒ๋ฆฌํ๋ค.
db.size
๋ก ๋ฐ์ดํฐ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ ,db.clear()
๋ก ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ค.- ์ด๋ฏธ ๋น์ด์๋ ๊ฒฝ์ฐ์ ๋ํ ์์ธ ์ฒ๋ฆฌ๋ ์ถ๊ฐํ๋ค.
โฌ๏ธPUT
PUT /youtubers/:id
- req: params.id, body(channelName)
- res: "์์ ๋์์ต๋๋ค"
app.put("/youtubers/:id", function (req, res) {
let { id } = req.params;
id = parseInt(id);
var youtuber = db.get(id);
if (youtuber == undefined) {
res.json({ message: "์กด์ฌํ์ง ์๋ ์ฑ๋์
๋๋ค" });
} else {
var newTitle = req.body.channelName;
youtuber.channelName = newTitle;
db.set(id, youtuber);
res.json({ message: `${newTitle}๋ก ์ฑ๋๋ช
์ด ๋ณ๊ฒฝ๋์์ต๋๋ค` });
}
});
req.params
์์id
๋ฅผ ๊ฐ์ ธ์ ์์ ํ ๋ฐ์ดํฐ๋ฅผ ์ง์ ํ๋ค.- ์กด์ฌํ์ง ์๋
id
์ธ ๊ฒฝ์ฐ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. req.body
์์ ์ ์ฑ๋๋ช ์ ๊ฐ์ ธ์ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์์ ํ๊ณ ๋ค์ Map์ ์ ์ฅํ๋ค.- ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ํ์ฉํด ๋์ ๋ฉ์์ง๋ฅผ ์์ฑํ๋ค.
โญ PUT ์์ฒญ์์๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ body ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก, Express์์ body-parser ๋ฏธ๋ค์จ์ด ์ค์ ์ด ํ์ํ๋ค!

๐HTTP ์ํ ์ฝ๋
API ์๋ต์ ๋ ์ ๋ฌธ์ ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด์๋ ์ ์ ํ HTTP ์ํ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํ๋ค. ์ง๊ธ๊น์ง๋ ๊ธฐ๋ณธ ์๋ต๋ง ๋ณด๋์ง๋ง, ์ํ ์ฝ๋๋ฅผ ํจ๊ป ๋ณด๋ด๋ฉด ํด๋ผ์ด์ธํธ์๊ฒ ๋ ๋ช ํํ ์ ๋ณด๋ฅผ ์ ๋ฌํ ์ ์๋ค.
1xx: ์ ๋ณด | ||
100 | Continue | ์์ฒญ์ ์ฒซ ๋ถ๋ถ์ด ๋ฐ์๋ค์ฌ์ก์ผ๋ฉฐ, ํด๋ผ์ด์ธํธ๋ ๋๋จธ์ง๋ฅผ ๊ณ์ ๋ณด๋ด์ผ ํจ |
101 | Switching Protocols | ์๋ฒ๊ฐ ํ๋กํ ์ฝ์ ์ ํ ์ค (์: ์น์์ผ) |
2xx: ์ฑ๊ณต | ||
200 | OK | ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌ๋จ |
201 | Created | ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌ๋์ด ์ ๋ฆฌ์์ค๊ฐ ์์ฑ๋จ |
204 | No Content | ์์ฒญ์ด ์ฑ๊ณตํ์ง๋ง ์๋ต ๋ณธ๋ฌธ์ด ์์ (DELETE ์ฑ๊ณต ์ ์ฃผ๋ก ์ฌ์ฉ) |
3xx: ๋ฆฌ๋ค์ด๋ ์ | ||
301 | Moved Permanently | ์์ฒญํ ๋ฆฌ์์ค์ URI๊ฐ ์๊ตฌ์ ์ผ๋ก ๋ณ๊ฒฝ๋จ |
302 | Found | ์์ฒญํ ๋ฆฌ์์ค์ URI๊ฐ ์ผ์์ ์ผ๋ก ๋ณ๊ฒฝ๋จ |
304 | Not Modified | ์บ์๋ ๋ฆฌ์์ค๊ฐ ์ฌ์ ํ ์ ํจํจ |
4xx: ํด๋ผ์ด์ธํธ ์ค๋ฅ | ||
400 | Bad Request | ์์ฒญ ๊ตฌ๋ฌธ์ด ์๋ชป๋จ |
401 | Unauthorized | ์ธ์ฆ์ด ํ์ํจ |
403 | Forbidden | ์๋ฒ๊ฐ ์์ฒญ์ ๊ฑฐ๋ถํจ (๊ถํ ๋ถ์กฑ) |
404 | Not Found | ์์ฒญํ ๋ฆฌ์์ค๋ฅผ ์ฐพ์ ์ ์์ |
405 | Method Not Allowed | ํ์ฉ๋์ง ์์ HTTP ๋ฉ์๋ |
409 | Conflict | ์์ฒญ์ด ํ์ฌ ์๋ฒ ์ํ์ ์ถฉ๋ (์: ์ด๋ฏธ ์กด์ฌํ๋ ๋ฆฌ์์ค ์์ฑ) |
5xx: ์๋ฒ ์ค๋ฅ | ||
500 | Internal Server Error | ์๋ฒ ๋ด๋ถ ์ค๋ฅ |
501 | Not Implemented | ์๋ฒ๊ฐ ์์ฒญ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์์ |
502 | Bad Gateway | ๊ฒ์ดํธ์จ์ด ๋๋ ํ๋ก์ ์๋ฒ๊ฐ ์๋ชป๋ ์๋ต์ ๋ฐ์ |
503 | Service Unavailable | ์๋น์ค๋ฅผ ์ผ์์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ (๊ณผ๋ถํ ๋๋ ์ ์ง๋ณด์) |
504 | Gateway Timeout | ๊ฒ์ดํธ์จ์ด ๋๋ ํ๋ก์ ์๋ฒ์ ์์ฒญ ์๊ฐ ์ด๊ณผ |
๋๋์ด CRUD๋ฅผ ํ ๋ฒ์ฉ ์ฒดํํด๋ณด๊ณ , ์ํ์ฝ๋๋ฅผ ์์๋ณด์๋ค. ์ฌ์ค ์ง๊ธ์ ๋ฌด์กฐ๊ฑด ์ฑ๊ณต์ ๊ฐ์ ํ ์ํฉ์ด๋ผ ์ํ ์ฝ๋์ ๋ํ ๊ณ ๋ ค๋ ์์๋๋ฐ, ๋ฐฑ์๋ api๋ฅผ ๋ฐ์ ๋๋ฉด ๊ฐ ์ํ ์ฝ๋์ ๋ฐ๋ฅธ ์๋ต๋ ๋ฐ๋ก ๋์์ฃผ๊ณค ํ๋๊ฒ ๊ธฐ์ต์ด ๋, ์ํ์ฝ๋๋ฅผ ํ์ฉํ api ๊ณ ๋ํ๊ฐ ํ์ํ์ง ์์๊น ์๊ฐ์ด ๋ ๋ค.
foreach, map ๋ฉ์๋ ๋ฑ ์ ์ฉํ ๊ฒ๋ค์ ๋ง์ด ๋ฐฐ์ฐ๊ธฐ๋ ํ์ง๋ง, Map์ผ๋ก ์ค์ต์ ์งํํ๋ ์ค์ api๋ผ๋ ๋๋์ด ๋ค์ง๋ ์๋๋ค. MariaDB๋ฅผ ์ฐ๋ํ์ฌ ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ฉ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ ์ถ๋ค.