[๋ฐ๋ธŒ์ฝ”์Šค] ๋นˆ ๊ฐ์ฒด ์ดˆ๊ธฐํ™” ํŒจํ„ด๊ณผ app.route()๋ฅผ ํ™œ์šฉํ•œ Express API ๊ตฌ์กฐํ™”

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

๐Ÿซฅ๋นˆ ๊ฐ์ฒด๋Š” truthy

๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด loginUser = {}๋กœ ์„ ์–ธํ•˜๊ณ  ๋กœ์ง์„ ์ž‘์„ฑํ•˜์˜€๋‹ค.

if (loginUser) {
  if (loginUser.password === password) {
    ...
  } else {
    res.status(401).json({ message: "๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค" });
  }
} else {
  res.status(401).json({ message: "์กด์žฌํ•˜์ง€ ์•Š๋Š” ์•„์ด๋””์ž…๋‹ˆ๋‹ค" });
}

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๋งž๊ณ  ์•„์ด๋””๋Š” ํ‹€๋ฆฌ๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ด๋„ ๋ฌด์กฐ๊ฑด "๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค.

 

loginUser์€ ์ดˆ๊ธฐ๊ฐ’์ด {}(๋นˆ ๊ฐ์ฒด)๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋นˆ ๊ฐ์ฒด๋Š” ๋ฌด์กฐ๊ฑด truthy๋กœ ํ‰๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์•„๋ž˜ ์กฐ๊ฑด์€ ๋ฌด์กฐ๊ฑด ์ฐธ์ด ๋œ๋‹ค.

if (loginUser) // ํ•ญ์ƒ true!

์ด๋กœ ์ธํ•ด ํ‹€๋ฆฐ ์•„์ด๋””์—ฌ๋„ ํ•ญ์ƒ ์ฒซ ๋ฒˆ์งธ ๋ถ„๊ธฐ๋ฌธ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜์–ด, ์š”์ฒญ๊ฐ’์— ์ƒ๊ด€์—†์ด "๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ์ž˜๋ชป๋œ ์‘๋‹ต์„ ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

 

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • loginUser์„ null๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ: ์ดˆ๊ธฐ๊ฐ’์„ null๋กœ ์„ค์ •ํ•˜์—ฌ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋นˆ ๊ฐ์ฒด์ž„์„ ํŒ๋ณ„ํ•˜๋Š” ๋กœ์ง ์ถ”๊ฐ€ํ•˜๊ธฐ: ๊ฐ์ฒด๊ฐ€ ๋น„์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •ํ™•ํ•œ ์กฐ๊ฑด ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • lodash : isEmpty ์‚ฌ์šฉ

 

๋นˆ ๊ฐ์ฒด๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•-Object.keys()

Object.keys()๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„๋“ค์„ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋นˆ ๊ฐ์ฒด์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ์ฒดํฌํ•˜๋ฉด ๋œ๋‹ค.

const obj1 = {};
const obj2 = { message: "not empty" };

console.log(Object.keys(obj1));
console.log(Object.keys(obj2));

const obj1 = {};
const obj2 = { message: "not empty" };
const num = 1;
const str1 = "one";
const str2 = ""; 

console.log(Object.keys(obj1).length === 0); //true
console.log(Object.keys(obj2).length === 0); //false
console.log(Object.keys(num).length === 0); //true
console.log(Object.keys(str1).length === 0); //false - ๋ฌธ์ž์—ด๋„ ๊ฐ์ฒด์ฒ˜๋Ÿผ ๋™์ž‘
console.log(Object.keys(str2).length === 0); //true

๋ฒ”์šฉ์ ์ธ isEmpty ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ฐ์ฒด ํƒ€์ž…์„ ๋จผ์ € ํ™•์ธํ•˜์—ฌ ๋นˆ ๊ฐ์ฒด์ธ์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

function isEmpty(obj) {
  if (obj.constructor === Object) {
    if (Object.keys(obj).length === 0) {
      return true;
    } else {
      return false;
    }
  } else {
    return false;
  }
}

console.log(isEmpty(obj1));
console.log(isEmpty(obj2));

โฌ†๏ธ๋กœ๊ทธ์ธ ๊ณ ๋„ํ™”

๋นˆ ๊ฐ์ฒด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ๊ฐœ์„ ๋œ ๋กœ๊ทธ์ธ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

app.use(express.json()); //json ๋ฏธ๋“ค์›จ์–ด
app.post("/login", function (req, res) {
  console.log(req.body);

  var hasUserId = false;
  var loginUser = {};

  const { userId, password } = req.body;

  db.forEach(function (user, id) {
    if (user.userId === userId) {
      hasUserId = true;
      loginUser = user;
    }
  });

  if (Object.keys(loginUser).length) {
    if (loginUser.password === password) {
      if (user.password === password) {
        res.status(200).json({ message: "๋กœ๊ทธ์ธ ์„ฑ๊ณต", user: user });
      } else {
        res.status(401).json({ message: "๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค" });
      }
    } else {
      res.status(401).json({ message: "์กด์žฌํ•˜์ง€ ์•Š๋Š” ์•„์ด๋””์ž…๋‹ˆ๋‹ค" });
    }
  }
});
  • hasUserId: ์‚ฌ์šฉ์ž๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•œ ํ”Œ๋ž˜๊ทธ ๋ณ€์ˆ˜
  • loginUser: ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด. ์ดˆ๊ธฐ๊ฐ’์€ ๋นˆ ๊ฐ์ฒด๋กœ ์„ค์ •
  • db.forEach(): ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ userId๋ฅผ ๋น„๊ตํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ loginUser์— ์ €์žฅ
  • Object.keys(loginUser).length: loginUser๊ฐ€ ๋นˆ ๊ฐ์ฒด์ธ์ง€ ํ™•์ธํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํŒ๋ณ„
  • ์‚ฌ์šฉ์ž๊ฐ€ ์กด์žฌํ•˜๊ณ  ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜๋ฉด ๋กœ๊ทธ์ธ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ ์ ˆํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค

 

๋กœ๊ทธ์ธ ๊ณ ๋„ํ™”-๋ฆฌํŒฉํ† ๋ง

์œ„ ์ฝ”๋“œ์—์„œ๋Š” hasUserId๋ผ๋Š” ํ”Œ๋ž˜๊ทธ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ์ถ”์ ํ•˜๊ณ  ์žˆ๋‹ค. ๋˜ํ•œ loginUser์„ ๋นˆ ๊ฐ์ฒด๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์ดํ›„ Object.keys(loginUser).length๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์กฐ์ž‘์„ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ์ƒ๋‹นํžˆ ๋–จ์–ด์กŒ๋‹ค.

 

๋ถˆํ•„์š”ํ•œ ๋ณ€์ˆ˜์™€ ๊ฐ์ฒด ์‚ฌ์šฉ ์—†์ด ๋™์ผํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋ง ํ•ด๋ณด์•˜๋‹ค.

app.use(express.json());

app.post("/login", function (req, res) {
  console.log(req.body);
  const { userId, password } = req.body;

  let loginUser = null;

  db.forEach((user) => {
    if (user.userId === userId) {
      loginUser = user;
    }
  });

  if (!loginUser) {
    return res.status(401).json({ message: "์กด์žฌํ•˜์ง€ ์•Š๋Š” ์•„์ด๋””์ž…๋‹ˆ๋‹ค" });
  }

  if (loginUser.password === password) {
    return res.status(200).json({ message: "๋กœ๊ทธ์ธ ์„ฑ๊ณต", user: loginUser });
  } else {
    return res.status(401).json({ message: "๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค" });
  }
});
  • loginUser ์ดˆ๊ธฐํ™”: null๋กœ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ํŒ๋ณ„
  • db.forEach(): ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ˆœํšŒํ•˜์—ฌ userId๋ฅผ ๋น„๊ตํ•˜์—ฌ loginUser์„ ์„ค์ •ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ loginUser๊ฐ€ null์ธ์ง€ ํ™•์ธํ•˜์—ฌ ์กด์žฌ ์—ฌ๋ถ€ ํŒ๋ณ„

 

โŒ์˜ค๋ฅ˜: db.find is not a function

๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ณ ๋„ํ™”ํ•  ๋•Œ, find() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ์„ ์‹œ๋„ํ•ด๋ณด์•˜๋‹ค. find() ๋ฉ”์„œ๋“œ๋Š” ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ, ์‚ฌ์šฉ์ž๋ฅผ ์ฐพ๋Š”๋ฐ ์ ํ•ฉํ•˜๊ณ  ์ง๊ด€์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ. ๋”ฐ๋ผ์„œ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์‹คํ–‰ํ•ด๋ณด์•˜๋‹ค.

app.post("/login", function (req, res) {
  console.log(req.body);

  const { userId, password } = req.body;

  const loginUser = db.find((user) => user.userId === userId);

  if (!loginUser) {
    return res.status(401).json({ message: "์กด์žฌํ•˜์ง€ ์•Š๋Š” ์•„์ด๋””์ž…๋‹ˆ๋‹ค" });
  }

  if (loginUser.password === password) {
    return res.status(200).json({ message: "๋กœ๊ทธ์ธ ์„ฑ๊ณต", user: loginUser });
  } else {
    return res.status(401).json({ message: "๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค" });
  }
});

๊ธฐ๋Œ€์™€๋Š” ๋‹ฌ๋ฆฌ, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.

 

์›์ธ

db๋ฅผ Map ๊ฐ์ฒด๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. Map ๊ฐ์ฒด๋Š” ํ‚ค-๊ฐ’ ์Œ์„ ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•˜๋ฉฐ, find()๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค...find() ๋Œ€์‹  forEach, entries(), values() ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœํšŒํ•ด์•ผ ํ•œ๋‹ค.

 

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

forEach๋ฅผ ์ผ๋‹ค. ๋กœ๊ทธ์ธ ๊ณ ๋„ํ™”-๋ฆฌํŒฉํ† ๋ง ์ฝ”๋“œ..!

 

Map ๊ด€๋ จ ๋ฉ”์„œ๋“œ

๋ฉ”์„œ๋“œ ์„ค๋ช…
db.get(key) ํ‚ค๋กœ ์š”์†Œ ์ฐพ๊ธฐ
db.set(key, value) ์š”์†Œ ์ถ”๊ฐ€
db.forEach((value, key) => {...}) ์ „์ฒด ์ˆœํšŒ
Array.from(db.values()) Map ๊ฐ’์„ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜

โœ‚๏ธ์ฑ„๋„ API ์‹ค์Šต

API ์„ค๊ณ„

์ƒ์„ฑ

method post
path /channels
req body(channelName)
res 201: ${channelName}๋‹˜ ์ฑ„๋„์„ ์‘์›ํ•ฉ๋‹ˆ๋‹ค.
400: ์ฑ„๋„ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.

 

์ˆ˜์ •

method put
path /channels/:id
req URL(id), body(channelName)
res 200: ์ฑ„๋„๋ช…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค,
404: ์ฑ„๋„์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

์‚ญ์ œ

method delete
path /channels/:id
req URL(id)
res 200: ${channelName} ์ฑ„๋„์„ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค.
404: ์ฑ„๋„์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

์กฐํšŒ

method get
path /channels
req x
res 200: ์ฑ„๋„ ์ „์ฒด ์กฐํšŒ ์„ฑ๊ณต(์ „์ฒด ๋ฐ์ดํ„ฐ list, json array)
404: ์ฑ„๋„์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

 

๊ฐœ๋ณ„ ์กฐํšŒ

method get
path /channels/:id
req URL(id)
res 200: ์ฑ„๋„ ์กฐํšŒ ์„ฑ๊ณต
404: ์ฑ„๋„์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

API ๊ตฌํ˜„-app.route()

์ง€๊ธˆ๊นŒ์ง€๋Š” ๋ชจ๋“  API์˜ ๊ฒฝ๋กœ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋‹ค ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ, Express์˜ route() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™์ผํ•œ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์ฒด์ธ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

โญ app.route()
๋™์ผํ•œ ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์ฒด์ธ์œผ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Express ๊ธฐ๋Šฅ
์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.!

app
  .route("/channels")
  .get((req, res) => {
    res.status(200).json({ message: "์ฑ„๋„ ์กฐํšŒ ์„ฑ๊ณต" });
  })
  .post((req, res) => {
    res.status(201).json({ message: "์ฑ„๋„ ์ƒ์„ฑ ์„ฑ๊ณต" });
  });

app
  .route("/channels/:id")
  .get((req, res) => {
    res.status(200).json({ message: "์ฑ„๋„ ์กฐํšŒ ์„ฑ๊ณต" });
  })
  .put((req, res) => {
    res.status(200).json({ message: "์ฑ„๋„ ์ˆ˜์ • ์„ฑ๊ณต" });
  })
  .delete((req, res) => {
    res.status(200).json({ message: "์ฑ„๋„ ์‚ญ์ œ ์„ฑ๊ณต" });
  });

 

๐Ÿ™„๋ผ์šฐํ„ฐ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ

๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ™์€ ์—”๋“œํฌ์ธํŠธ๋ผ๋ฆฌ ๋ฌถ์–ด์„œ ํŽธํ•˜๊ณ  ์ฝ”๋“œ๊ฐ€ ํ•œ๊ฒฐ ๊ฐ„๊ฒฐํ•ด์ง€๊ธด ํ–ˆ์ง€๋งŒ, ์—ฌ์ „ํžˆ ๋น„ํšจ์œจ์ ์ธ ๋ถ€๋ถ„์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค. ๋ชจ๋“  HTTP ๋ฉ”์„œ๋“œ๊ฐ€ req, res๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋ฐ, ์ด๊ฒƒ๋“ค์„ ๊ณ„์† ๋”ฐ๋กœ ์„ ์–ธํ•ด์ฃผ๊ณ , ๋˜ ๊ฐ์ž ๋™์ž‘๊นŒ์ง€ ํ•œ ์ฝ”๋“œ ๋‚ด ์ž‘์„ฑํ•˜์˜€๋”๋‹ˆ route()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ์„๊นŒ ์‹ถ์„ ์ •๋„๋กœ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์กŒ๋‹ค. ๋” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ ๊ณ ๋ฏผํ•ด๋ณด์•˜๋‹ค.

 

๋ฉ”์„œ๋“œ๋ณ„๋กœ ๋‚˜๋ˆ ์•ผ ํ•˜๋Š” ์ด์œ 

์‚ฌ์‹ค ๋ผ์šฐํ„ฐ์—์„œ ์ฝœ๋ฐฑ์„ ๊ฐ๊ฐ ๋ถ„๋ฆฌํ•ด์„œ ์ž‘์„ฑํ•˜๋Š” ์ด์œ ๋Š” HTTP ๋ฉ”์„œ๋“œ๋งˆ๋‹ค ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, GET ์š”์ฒญ๊ณผ POST ์š”์ฒญ์€ ๊ฐ™์€ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์ „ํ˜€ ๋‹ค๋ฅธ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

๊ฐ HTTP ๋ฉ”์„œ๋“œ๋ณ„ ๋ชฉ์ ๊ณผ ๋กœ์ง์„ ์‚ดํŽด๋ณด๋ฉด,

๋ฉ”์„œ๋“œ ๋ชฉ์  ์ผ๋ฐ˜์ ์ธ ๋กœ์ง
GET /channels ๋ชฉ๋ก ์กฐํšŒ DB์—์„œ ๋ชจ๋“  ์ฑ„๋„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
POST /channels ์ƒ์„ฑ ์š”์ฒญ ๋ณธ๋ฌธ์—์„œ ์ฑ„๋„ ์ •๋ณด ๋ฐ›์•„ DB์— ์ถ”๊ฐ€
GET /channels/:id ๋‹จ์ผ ์กฐํšŒ ํŠน์ • ์ฑ„๋„ id๋กœ ์กฐํšŒ
PUT /channels/:id ์ˆ˜์ • ํ•ด๋‹น ์ฑ„๋„์˜ ์ •๋ณด ์ˆ˜์ •
DELETE /channels/:id ์‚ญ์ œ ์ฑ„๋„ ์‚ญ์ œ

 

๊ทธ๋ ‡๋‹ค๋ฉด ๋ผ์šฐํ„ฐ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์ด๋ฉด์„œ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ?

 

โœ…๊ณตํ†ต ๋กœ์ง์„ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ

์ฒซ ๋ฒˆ์งธ ํ•ด๊ฒฐ์ฑ…์€ ๊ณตํ†ต ๋กœ์ง์„ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์„ฑ๊ณต ์‘๋‹ต์„ ๋ณด๋‚ด๋Š” ๋กœ์ง์ด ์—ฌ๋Ÿฌ ์—”๋“œํฌ์ธํŠธ์—์„œ ๋ฐ˜๋ณต๋œ๋‹ค๋ฉด, ์ด๋ฅผ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

function sendSuccess(message) {
  return (req, res) => {
    res.status(200).json({ message });
  };
}

app.route("/channels")
  .get(sendSuccess("์ฑ„๋„ ์กฐํšŒ ์„ฑ๊ณต"))
  .post((req, res) => {
    res.status(201).json({ message: "์ฑ„๋„ ์ƒ์„ฑ ์„ฑ๊ณต" });
  });

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฐ˜๋ณต๋˜๋Š” ํŒจํ„ด์„ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•˜์—ฌ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 

โœ…๋ผ์šฐํ„ฐ๋ฅผ ๋”ฐ๋กœ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ (Controller ๊ตฌ์กฐ)

๋‘ ๋ฒˆ์งธ ํ•ด๊ฒฐ์ฑ…์€ ๋ผ์šฐํ„ฐ์™€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๋ฐฉ์‹์€ MVC ํŒจํ„ด์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์œผ๋กœ, ๋ผ์šฐํ„ฐ๋Š” URL ๊ฒฝ๋กœ์™€ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๊ณ , ์‹ค์ œ ๋กœ์ง์€ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

// channels.controller.js
exports.getAll = (req, res) => {
  // ์ฑ„๋„ ๋ชฉ๋ก ์กฐํšŒ ๋กœ์ง
};

exports.create = (req, res) => {
  // ์ฑ„๋„ ์ƒ์„ฑ ๋กœ์ง
};

// router.js
router.route("/channels")
  .get(channelsController.getAll)
  .post(channelsController.create);

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ผ์šฐํŒ…๋งŒ ์„ ์–ธํ•ด๋‘๊ณ , ํ•ต์‹ฌ ๋กœ์ง์€ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง„๋‹ค. ๋˜ํ•œ, ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ๋„ ํ–ฅ์ƒ๋œ๋‹ค.

 

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•๋“ค์„ ํ†ตํ•ด Express ๋ผ์šฐํ„ฐ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ํšจ์œจ์„ฑ์„ ํฌ๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์ด๋Ÿฌํ•œ ๊ตฌ์กฐํ™”๋Š” ๋”์šฑ ์ค‘์š”ํ•ด์ง„๋‹ค!

 

API ๊ตฌํ˜„-์™„์„ฑ ์ฝ”๋“œ

๋”๋ณด๊ธฐ
const { channel } = require("diagnostics_channel");
const express = require("express");
const app = express();

app.listen(6000);

app.use(express.json());

let db = new Map();
var id = 1;

app
  .route("/channels")
  .get((req, res) => {
    // const channels = Array.from(db.values());
    // res.status(200).json({ message: "์ฑ„๋„ ์ „์ฒด ์กฐํšŒ ์„ฑ๊ณต", channels });

    if (db.size !== 0) {
      var channels = {};
      db.forEach(function (value, key) {
        channels[key] = value;
      });
      console.log(channels);
      res.status(200).json({ message: "์ฑ„๋„ ์ „์ฒด ์กฐํšŒ ์„ฑ๊ณต", channels });
    } else {
      res.status(404).json({ message: "์ฑ„๋„์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค." });
    }
  })
  .post((req, res) => {
    if (req.body.channelName) {
      db.set(id++, req.body);

      res
        .status(201)
        .json({ message: `${req.body.channelName} ์ฑ„๋„์„ ์‘์›ํ•ฉ๋‹ˆ๋‹ค.` });
    } else {
      res.status(400).json({ message: "์ฑ„๋„ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”." });
    }
  });

app
  .route("/channels/:id")
  .get((req, res) => {
    let { id } = req.params;
    id = parseInt(id);

    var channel = db.get(id);

    if (channel) {
      res.status(200).json({ message: "์ฑ„๋„ ์กฐํšŒ ์„ฑ๊ณต", channel: channel });
    } else {
      res.status(404).json({ message: "์ฑ„๋„์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค." });
    }
  })
  .put((req, res) => {
    let { id } = req.params;
    id = parseInt(id);

    var channel = db.get(id);

    if (channel) {
      var newChannel = req.body.channelName;
      channel.channelName = newChannel;
      db.set(id, channel);
      res.status(200).json({
        message: "์ฑ„๋„๋ช…์ด ์„ฑ๊ณต์ ์œผ์œผ๋กœ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.",
        channel: channel,
      });
    } else {
      res.status(404).json({ message: "์ฑ„๋„์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค." });
    }
  })
  .delete((req, res) => {
    let { id } = req.params;
    id = parseInt(id);

    var channel = db.get(id);

    if (channel) {
      db.delete(id);
      res
        .status(200)
        .json({ message: `${channel.channelName} ์ฑ„๋„์„ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค.` });
    } else {
      res.status(404).json({ message: "์ฑ„๋„์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค." });
    }
  });

์ด๋ฒˆ ์‹ค์Šต์„ ํ†ตํ•ด JavaScript์˜ truthy/falsy ๊ฐœ๋…์ด ์‹ค์ œ ์ฝ”๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ์ฒด๊ฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ž๋ฃŒ๊ตฌ์กฐ์˜ ํŠน์„ฑ๊ณผ ๊ฐ’์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ๋ช…ํ™•ํžˆ ๊ณ ๋ คํ•˜๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ์งœ์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊นŠ์ด ๊นจ๋‹ฌ์•˜๋‹ค.

 

๋˜ํ•œ, Express์˜ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด API๋ฅผ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ตํ˜”๋‹ค. app.route()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ™์€ ์—”๋“œํฌ์ธํŠธ์˜ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ๋ฌถ์œผ๋‹ˆ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์€ ์•ฝ๊ฐ„ ํ–ฅ์ƒ๋˜์—ˆ์ง€๋งŒ, ์ „์ฒด์ ์œผ๋กœ๋Š” ์—ฌ์ „ํžˆ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š”๋‹ค. ์•ž์œผ๋กœ API๊ฐ€ ๋” ๋ณต์žกํ•ด์งˆ ํ…๋ฐ, ์ด ์ •๋„ ๊ตฌ์กฐ๊ฐ€ ํด๋ฆฐ์ฝ”๋“œ์˜ ์ตœ์„ ์ด๋ผ๋ฉด ๊ฝค ๋‹ต๋‹ตํ•  ๊ฒƒ ๊ฐ™์•˜๋‹ค.

 

๋‹คํ–‰ํžˆ ์ข€ ๋” ์•Œ์•„๋ณด๋‹ˆ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ ํŒจํ„ด์„ ์ ์šฉํ•˜๋Š” ๋“ฑ ๋” ๊ตฌ์กฐํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋งŽ์ด ์žˆ๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋๋‹ค. ํŠนํžˆ, Express๋ณด๋‹ค NestJS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฐ ๊ตฌ์กฐ๋ฅผ ๋ณด๋‹ค ํŽธ๋ฆฌํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š”๋ฐ, Nest ๊ณต๋ถ€ ์—ด์”ธํžˆ ํ•ด์•ผ์ง€

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

[๋ฐ๋ธŒ์ฝ”์Šค] RDBMS ํ•ต์‹ฌ ๊ฐœ๋…๊ณผ ์ •๊ทœํ™” ์ดํ•ด(RDBMS vs NoSQL, PK, FK)  (1) 2025.04.25
[๋ฐ๋ธŒ์ฝ”์Šค] Express ๋ผ์šฐํ„ฐ ๋ชจ๋“ˆํ™”์™€ userId๋ฅผ ํ™œ์šฉํ•œ API ๊ตฌ์กฐ ๊ฐœ์„   (0) 2025.04.23
[๋ฐ๋ธŒ์ฝ”์Šค] HTTP ์ƒํƒœ์ฝ”๋“œ๋ฅผ ํ™œ์šฉํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๊ณ ๋„ํ™”(+ํ•ธ๋“ค๋Ÿฌ, ๋ฆฌ์Šค๋„ˆ, ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ)  (0) 2025.04.16
[๋ฐ๋ธŒ์ฝ”์Šค] Express DELETE์™€ PUT ๋ฉ”์„œ๋“œ ํ™œ์šฉ(+http ์ƒํƒœ์ฝ”๋“œ)  (0) 2025.04.15
[๋ฐ๋ธŒ์ฝ”์Šค] โญ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋ฅผ ์จ์•ผ ํ•˜๋Š” ์ด์œ ์™€ DB ๋ฉด์ ‘ ๊ฟ€ํŒ  (0) 2025.04.14
'๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค/TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [๋ฐ๋ธŒ์ฝ”์Šค] RDBMS ํ•ต์‹ฌ ๊ฐœ๋…๊ณผ ์ •๊ทœํ™” ์ดํ•ด(RDBMS vs NoSQL, PK, FK)
  • [๋ฐ๋ธŒ์ฝ”์Šค] Express ๋ผ์šฐํ„ฐ ๋ชจ๋“ˆํ™”์™€ userId๋ฅผ ํ™œ์šฉํ•œ API ๊ตฌ์กฐ ๊ฐœ์„ 
  • [๋ฐ๋ธŒ์ฝ”์Šค] HTTP ์ƒํƒœ์ฝ”๋“œ๋ฅผ ํ™œ์šฉํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๊ณ ๋„ํ™”(+ํ•ธ๋“ค๋Ÿฌ, ๋ฆฌ์Šค๋„ˆ, ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ)
  • [๋ฐ๋ธŒ์ฝ”์Šค] Express DELETE์™€ PUT ๋ฉ”์„œ๋“œ ํ™œ์šฉ(+http ์ƒํƒœ์ฝ”๋“œ)
ํ‚ํ‚์ž‰
ํ‚ํ‚์ž‰
๋ฟŒ๋ก ํŠธ ๊ฐœ๋ฐœ์ž(์ง€๋ง์ƒ)์˜ ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž ๋„์ „๊ธฐ
  • ํ‚ํ‚์ž‰
    monicx.dev
    ํ‚ํ‚์ž‰
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (118) N
      • ๐Ÿ–ฅ๏ธdevelop (11)
        • Github (2)
        • Frontend (4)
        • Backend (5)
        • Mobile (0)
        • CS (0)
        • Three.js (0)
        • Docker (0)
      • ๐Ÿ“šbook (3) N
        • npm Deep Dive (3) N
      • ๐Ÿ“•review (4) N
        • ์ฑ… (12)
        • ํ–‰์‚ฌ (0)
        • ํšŒ๊ณ  (2)
      • โญproject (5)
        • petiary (2)
        • ๆšŽ่ฉ  (0)
        • ์ธํ„ด (2)
      • ๐Ÿ˜ถ‍๐ŸŒซ๏ธalgorithm (0)
      • ๐Ÿ’กtips (1)
      • ๐Ÿ˜Ždaily (10)
      • ๐Ÿ•น๏ธgame (0)
      • ๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค (66)
        • TIL (42)
        • ํ”„๋กœ์ ํŠธ (16)
        • ํšŒ๊ณ  (8)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

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

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

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
ํ‚ํ‚์ž‰
[๋ฐ๋ธŒ์ฝ”์Šค] ๋นˆ ๊ฐ์ฒด ์ดˆ๊ธฐํ™” ํŒจํ„ด๊ณผ app.route()๋ฅผ ํ™œ์šฉํ•œ Express API ๊ตฌ์กฐํ™”
์ƒ๋‹จ์œผ๋กœ

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