์ด์ ์๊ฐ์ Express์์ req.params()
๋ฅผ ํ์ฉํด์ URL์์ ์ ๋ณด๋ฅผ ์ถ์ถํ๊ณ , ์ด๋ฅผ ์๋ฒ ์๋ต์ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ๋ค. ์ค๋์ URL์์ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ ์๋ก์ด ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ , ๋น๊ตฌ์กฐํ๋ฅผ ์ฌ์ฉํด์ ์ฝ๋๋ฅผ ๊ฐ๋จํ๊ฒ ํ๋๋ฒ๊ณผ Map ์๋ฃ๊ตฌ์กฐ๋ฅผ Express์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ๋ค.
๐URL์์ ์ ๋ณด ์ถ์ถํ๊ธฐ
req.query
URL์ ์ฟผ๋ฆฌ ์คํธ๋ง, ? ๋ค์ ๋ถ๋ key=value ์
app.get("/watch", function (req, res) {
const q = req.query;
console.log(q);
res.json(q);
});
app.listen(3001);
- ํด๋ผ์ด์ธํธ ์์ฒญ์ด
http://localhost:3001/watch?v=abc123&t=42
ํ์์ผ๋ก ๋ค์ด์จ๋ค๋ฉด, - ์ฝ์์ ํ์ธํ์ ๋
{ v: 'abc123', t: '42' }
๊ฐ ์ถ๋ ฅ๋๋ค.
ํน์ง
- ์ฌ๋ฌ ๊ฐ์ ํ ๋ฒ์ ์ ์กํ ์ ์๋ค(
?a=1&b=2
) - URL์ ๋ ธ์ถ๋๊ธฐ ๋๋ฌธ์ ๋ฏผ๊ฐํ ์ ๋ณด์๋ ์ ์ ํ์ง ์๋ค.
GET
๋ฐฉ์์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
์ ํ๋ธ ๋งํฌ๋ฅผ ๋ฏ์ด๋ณด๋ฉด,
https://www.youtube.com/watch?v=RFawCm5J26s&t=1s
์ด๋ฐ ์์ผ๋ก URL์ด ๊ตฌ์ฑ๋์ด ์๋ค. ๋ฐ๋ผ์ ์ ํ๋ธ URL๋ง์ผ๋ก๋ ์์์ ๋ํ ์ ๋ณด(์ฟผ๋ฆฌ์ ์๊ฐ)๋ฅผ ์ถ์ถํ ์ ์๋ค.
req.params
URL ๊ฒฝ๋ก ์ผ๋ถ์์ ๊ฐ์ ์ถ์ถ
app.get("/:nickname", (req, res) => {
const { nickname } = req.params;
res.send(nickname);
});
- ํด๋ผ์ด์ธํธ ์์ฒญ์ด
http://localhost:3001/@TEO_universe
ํ์์ผ๋ก ๋ค์ด์จ๋ค๋ฉด, - ์ฝ์์๋
@TEO_universe
๊ฐ ์ถ๋ ฅ๋๋ค.
ํน์ง
- RESTful URL์์ ์์ ์๋ณ์๋ก ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
- URL ๊ฒฝ๋ก ์์ฒด์ ํฌํจ๋์ด ์์ด์ ๊น๋ํ๊ณ , ํด๋ผ์ด์ธํธ ์ ์ฅ์์ ์ง๊ด์ ์ด๋ค.
req.query vs req.params
params๋ ์์์ ์๋ณํ๊ณ , query๋ ์ด๋ป๊ฒ ๋ณด์ฌ์ค์ง๋ฅผ ๊ฒฐ์ ํ๋ค!
req.params |
req.query |
|
---|---|---|
์์น | URL ๊ฒฝ๋ก /user/:id |
URL ์ฟผ๋ฆฌ ?id=123 |
์ฌ์ฉ ๋ชฉ์ | ์๋ณ์, ๊ฒฝ๋ก ๊ธฐ๋ฐ API | ๊ฒ์ ์กฐ๊ฑด, ์ ๋ ฌ ๋ฑ ์ต์ |
๋ ธ์ถ ์ฌ๋ถ | ๊ฒฝ๋ก์ ๊ทธ๋๋ก ๋ ธ์ถ | ?key=value ๋ก ๋
ธ์ถ |
์์ | /product/3 |
/product?category=shoes |
๐ฉ๋น๊ตฌ์กฐํ ํ ๋น(Destructuring)
๊ฐ์ฒด๋ ๋ฐฐ์ด์ ๋ด๋ถ ๊ฐ์ ๋ณ์์ ๋น ๋ฅด๊ฒ ์ถ์ถ ํ ์ ์๊ฒ ํ๋ค.
๊ฐ์ฒด ๋น๊ตฌ์กฐํ
const {v, t} = req.query
req.query
์ ์๋v
,t
๊ฐ์ ๊ฐ๋ณ ๋ณ์๋ก ๊บผ๋ธ๋ค.- JS ๋ด๋ถ์ ์ผ๋ก๋ `{v:'abc', t:'123'}์์ key ์ด๋ฆ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ ๋งค์นญ์ํจ๋ค.
๋ฐฐ์ด ๋น๊ตฌ์กฐํ
const [v, t] = ["abc", "123"];
- ๋ฐฐ์ด ๊ฐ์ด ์์๋๋ก ํ ๋น๋๋ค.
v = 'abc'
, 't = '123'`
๐น์ค์ต: ์ ํ๋ฒ ์ ๋ณด API
const express = require("express");
const app = express();
let youtuber1 = {
channelName: "์ญ์ค์ผ",
subscriber: "593๋ง๋ช
",
videoNum: "993๊ฐ",
};
let youtuber2 = {
channelName: "์นจ์ฐฉ๋งจ",
subscriber: "227๋ง๋ช
",
videoNum: "6.6์ฒ๊ฐ",
};
let youtuber3 = {
channelName: "ํ
์ค",
subscriber: "54.8๋ง๋ช
",
videoNum: "726๊ฐ",
};
app.get("/:nickname", (req, res) => {
const { nickname } = req.params;
if (nickname === "@15ya.fullmoon") {
res.json(youtuber1);
} else if (nickname === "@ChimChakMan_Official") {
res.json(youtuber2);
} else if (nickname === "@TEO_universe") {
res.json(youtuber3);
} else {
res.json({ message: "์ฐพ์ ์ ์์ต๋๋ค." });
}
res.json({ channel: nickname });
});
app.listen(3000);
โญ ์์ธ ์ฒ๋ฆฌ
์ ์์ ์ด์ง ์์ ์ํฉ์ ๋ฏธ๋ฆฌ ์์ธกํ๊ณ , ์ํฉ์ ๋๋นํ ์ฝ๋(์ค๋ฅ ๋ฉ์์ง ๋ฑ)
๋๋ค์์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ์๋ ์๋ฒ๊ฐ ์ ์์ ์ผ๋ก ์๋ตํ๊ฒ ํ๊ธฐ ์ํด ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ค.
๐บ๏ธMap
key value ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ด์ฅ ๊ฐ์ฒด
let db = new Map();
db.set(1, "NoteBook");
db.set(2, "Mouse ");
db.set(3, "Keyboard");
console.log(db);
console.log(db.get(1));
//๊ฒฐ๊ณผ: Map(3) { 1 => 'NoteBook', 2 => 'Mouse ', 3 => 'Keyboard' }
// NoteBook
set
์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ,get
์ผ๋ก ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํด ์ถ๋ ฅํ๋ค.
๐คMap ์ ์ฒด๋ฅผ JSON์ผ๋ก ๋ณด๋ด๊ณ ์ถ์ ๋๋ ๋ณํ์ด ํ์ํ๋ค.
res.json(Object.fromEntries(db));โ
Map vs Object
Map | Object | |
ํค ํ์ | ์ด๋ค ํ์ ์ด๋ ๊ฐ๋ฅ | ๋ฌธ์์ด, ์ฌ๋ณผ๋ง ๊ฐ๋ฅ |
์์ | ์ฝ์ ์์ ์ ์ง | ์์ ์์ |
์ฑ๋ฅ | ๋๋ ๋ฐ์ดํฐ์ ์ ๋ฆฌ | ์๋ ๋ฐ์ดํฐ |
- ๋น๋ ๋ฎ์ ํค ์ ๊ทผ, ๋์ ๋ฐ์ดํฐ ์ถ๊ฐ/์ญ์ ๋ง์ ๊ฒฝ์ฐ์๋ Map์ด ์ฑ๋ฅ ์ ์ ๋ฆฌํ๋ค.
- JSON ์ง๋ ฌํ, ๋คํธ์ํฌ ์ก์์ ๋ฑ์์๋ Object๊ฐ ๋ ์ ํฉํ๋ค.
express์ Map ํ์คํผ
const express = require("express");
const app = express();
app.get("/favicon.ico", (req, res) => res.status(204).end());
let db = new Map();
db.set(1, "NoteBook");
db.set(2, "Mouse ");
db.set(3, "Keyboard");
//localhost:3001/1 => NoteBook
//localhost:3001/2 => Mouse
//localhost:3001/3 => Keyboard
app.get("/:id", (req, res) => {
let { id } = req.params;
console.log(id);
id = parseInt(id);
console.log(db.get(id));
if (db.get(id) == undefined) {
res.json({ message: "์ํ์ด ์์ต๋๋ค" });
} else {
res.json({
id: id,
product: db.get(id),
});
}
});
app.listen(3002);
- ๋ง์ฝ ์ ๋ ฅํ id์ ๋์ํ๋ ๊ฐ์ด ์๋ค๋ฉด, id๋ง ์ถ๋ ฅํ๋ค.
- undefined์ธ ๊ฒฝ์ฐ์ ๋ํ ์์ธ์ฒ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ค.
โ์ค๋ฅ: params.id์ Map ํค ํ์ ๋ถ์ผ์น
URL ๊ฒฝ๋ก๋ก ๋ฐ์ req.params.id
๋ ๋ฌธ์์ด์ด๋ค. ํ์ง๋ง Map์ ํค๋ ์ซ์๋ก ์ ์ฅ๋์ด ์๋ค. ๋ฐ๋ผ์ db.get("2") -> undefined
๋ก ์ถ๋ ฅ๋๋ ๊ฒ์ด๋ค.
โ ํด๊ฒฐ
parseInt(id)๋ก ๋ช ์์ ํ์ ๋ณํํ์ฌ ์ฌ์ฉ
โ์ค๋ฅ: favicon ์์ฒญ์ผ๋ก ์ธํ undefined ์ถ๋ ฅ
ํ์
๋ถ์ผ์น๋ก undefined
๊ฐ ์ถ๋ ฅ๋๋ ๋ฌธ์ ๋ ํ์
์ ๋ณํํ์ฌ ํด๊ฒฐํ์๋ค. ํ์ง๋ง ์ฝ์์ ๋ณด๋ฉด, ์ฌ์ ํ undefined๊ฐ ํ๋ ๋ ์ถ๋ ฅ๋๊ณ ์๋ค.
console.log(db.get(id));
if (db.get(id) == undefined) {
res.json({ message: "์ํ์ด ์์ต๋๋ค" });
} else {
res.json({
id: id,
product: db.get(id),
});
}
์ ์ฝ๋์ console.log(db.get(id))
๊ฐ ๋ ๋ฒ ์คํ๋์ด์ ๋ฐ์ํ๋ ๋ฌธ์ ์ด๋ค. ๋ ์ ํํ๋, favicon
์์ฒญ์ ๋ํด์๋ /:id
๋ผ์ฐํธ๊ฐ ์คํ๋๊ณ ์์ด์ ๋ฐ์ํ๋ ๋ฌธ์ ์๋ค.
โ ํด๊ฒฐ
app.get("/favicon.ico", (req, res) => res.status(204).end());โ
์ ์ฝ๋๋ฅผ ์ถ๊ฐํ์ฌ ํ๋น์ฝ ์์ฒญ์ ๋ฌด์ํ๋๋ก ํ๋ค. ๋ค์ ์ถ๋ ฅํด๋ณด๋ฉด id=2 ์ ๋ํ ์ ๋ณด๋ง ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.