[๋ฐ๋ธŒ์ฝ”์Šค] Express URL ํ•ธ๋“ค๋ง (req.query(), ๋น„๊ตฌ์กฐํ™”, Map)

2025. 4. 10. 21:21ยท๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค/TIL

์ด์ „ ์‹œ๊ฐ„์— 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 ์— ๋Œ€ํ•œ ์ •๋ณด๋งŒ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

'๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค > TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋ฐ๋ธŒ์ฝ”์Šค] Postman์œผ๋กœ API ํ…Œ์ŠคํŠธํ•˜๊ธฐ(GET, POST)  (0) 2025.04.12
[๋ฐ๋ธŒ์ฝ”์Šค] Express Generator ๊ตฌ์กฐ์™€ ํ•ต์‹ฌ ํŒŒ์ผ ๋œฏ์–ด๋ณด๊ธฐ(www, app.js)  (2) 2025.04.11
[๋ฐ๋ธŒ์ฝ”์Šค] Express REST API ๊ธฐ์ดˆ(get(), res.send(), res.json(), res.params())  (1) 2025.04.08
[๋ฐ๋ธŒ์ฝ”์Šค] Node.js ๋ชจ๋“ˆ๊ณผ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ดํ•ด(๋ชจ๋“ˆํ™”, npm, ๋…ผ๋ธ”๋กœํ‚น I/O)  (1) 2025.04.07
[๋ฐ๋ธŒ์ฝ”์Šค] API์™€ REST API ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ธฐ  (0) 2025.04.05
'๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค/TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [๋ฐ๋ธŒ์ฝ”์Šค] Postman์œผ๋กœ API ํ…Œ์ŠคํŠธํ•˜๊ธฐ(GET, POST)
  • [๋ฐ๋ธŒ์ฝ”์Šค] Express Generator ๊ตฌ์กฐ์™€ ํ•ต์‹ฌ ํŒŒ์ผ ๋œฏ์–ด๋ณด๊ธฐ(www, app.js)
  • [๋ฐ๋ธŒ์ฝ”์Šค] Express REST API ๊ธฐ์ดˆ(get(), res.send(), res.json(), res.params())
  • [๋ฐ๋ธŒ์ฝ”์Šค] Node.js ๋ชจ๋“ˆ๊ณผ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ดํ•ด(๋ชจ๋“ˆํ™”, npm, ๋…ผ๋ธ”๋กœํ‚น I/O)
ํ‚ํ‚์ž‰
ํ‚ํ‚์ž‰
๋ฟŒ๋ก ํŠธ ๊ฐœ๋ฐœ์ž(์ง€๋ง์ƒ)์˜ ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž ๋„์ „๊ธฐ
  • ํ‚ํ‚์ž‰
    monicx.dev
    ํ‚ํ‚์ž‰
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (86) N
      • ๐Ÿ–ฅ๏ธdevelop (11)
        • Github (2)
        • Frontend (4)
        • Backend (5)
        • Mobile (0)
        • CS (0)
        • Three.js (0)
        • Docker (0)
      • ๐Ÿ“•review (15)
        • ์ฑ… (10)
        • ํ–‰์‚ฌ (0)
        • ํšŒ๊ณ  (2)
      • โญproject (5)
        • petiary (2)
        • ๆšŽ่ฉ  (0)
        • ์ธํ„ด (2)
      • ๐Ÿ˜ถ‍๐ŸŒซ๏ธalgorithm (0)
      • ๐Ÿ’กtips (1)
      • ๐Ÿ˜Ždaily (10)
      • ๐Ÿ•น๏ธgame (0)
      • ๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค (44) N
        • TIL (26) N
        • ํ”„๋กœ์ ํŠธ (13) N
        • ํšŒ๊ณ  (5)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
  • ๋งํฌ

    • ๋ฒจ๋กœ๊ทธ
  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
ํ‚ํ‚์ž‰
[๋ฐ๋ธŒ์ฝ”์Šค] Express URL ํ•ธ๋“ค๋ง (req.query(), ๋น„๊ตฌ์กฐํ™”, Map)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”