[Node.js] Postman: 조회, 삭제, 수정

깡뉴·2025년 2월 18일
post-thumbnail

지난 시간에 이어서~

전체조회 기능을 만들어보자!

🍋 youtuber-demo.js 업데이트(1)

🍎 기존 API 설계 수정

  1. 복수형 표현으로 수정: youtuber → youtubers
  2. 유튜버 '등록': POST /youtubers
    - req: body
    <= channelTitle,
    sub = 0,
    videoNum = 0 (-> 신규 유튜버 정보 전달)
    - res: "channelTitle 님, 가입해
    주셔서 감사합니다!")

🍎 전체 조회

전체 유튜버 '조회' → GET /youtubers
- req: ❌
- res: map 전체 조회

❗️ db.values(): 콘솔로는 찍히는데 Postman에서는...

values를 사용하면 콘솔에는 값이 보이나 Body에는 보이지 않는다.
이는 map 형태를 json으로 바로 던져주지 못하기 때문이다.

app.get("/youtubers", (req, res) => {
  console.log(db.values());
  res.json(db.values());
});

🧃 forEach문 등장!

function으로 키 값과 value 값을 받아서
json으로 던져주면

var youtubers = {};

app.get("/youtubers", (req, res) => {
  db.forEach((value, key) => {
    youtubers[key] = value;
  });
  res.json(youtubers);
});

전체 조회 기능 완성 ✨

🧃 등록 후 전체 조회하기


✅ forEach문을 알아보자

🌟 콜백함수

1️⃣ 매개변수가 1개 → value

2️⃣ 매개변수가 2개 → value, index

3️⃣ 매개변수 3개 → value, index, 객체 전체

🌟 map과 forEach문의 만남

index 크기에 상관없이 작성한 순서대로 배열됨을 알 수 있다.


✅ map을 알아보자

아래 사진을 보면 forEach문은 map과 차이가 없다.

그러나 만일 value에 대한 return 값을 던져달라고 요청하면?

const arr = [1, 2, 3, 4, 5];

const forEachArray = arr.forEach((a, b, c) => {
  return a * 2;
});

const mapArray = arr.map((a, b, c) => {
  return a * 2;
});

console.log(`forEach로 return : ${forEachArray}`);
console.log(`Map으로 return : ${mapArray}`);

forEach로는 새로운 배열을 만들 수 ❌,
map으로는 가능함을 알 수 있다.


🍋 youtuber-demo.js 업데이트(2)

🍎 개별 삭제

개별 유튜버 '삭제' → DELETE /youtubers/:id

  • url이 개별 유튜버 조회와 겹침
    - (문제가 되나? 아니요 괜찮습니당 → 메소드가 다르기 때문이지요)
  • req : params.id
  • res : ${channelTitle} 님, 또 찾아주세요.

코드를 작성해보면 이러하다.

app.delete("/youtubers/:id", (req, res) => {
  let { id } = req.params;
  id = parseInt(id);
  const youtuber = db.get(id).channelTitle;

  db.delete(id);

  res.json({
    message: `${youtuber} 님, 또 찾아주세요.`,
  });
});

이때 parseInt()를 하는 이유는 id를 문자열로 인식하기 때문에
이를 숫자로 변환하기 위함이다.

결과는 다음과 같다.

삭제하면 더 이상 그 유튜버의 정보를 불러올 수 없음!

🧃 예외 처리도 잊지말고 하자!

없는 유튜버 삭제를 요청할 때는
당황하지 말고 몇 줄의 코드만 더 추가하자.

if문을 사용해 처리한다.

app.delete("/youtubers/:id", (req, res) => {
  let { id } = req.params;
  id = parseInt(id);
  const youtuber = db.get(id);

  db.delete(id);

  if (youtuber === undefined) {
    res.json({
      message: `${id}로 가입된 정보가 없습니다.`,
    });
  } else {
    const channelTitle = youtuber.channelTitle;
    res.json({
      message: `${channelTitle} 님, 또 찾아주세요.`,
    });
  }
});

제대로 작동함을 확인할 수 있다.


✅ 리팩토링에 대해 알아보자

⭐️ 하는 이유

  • 이해하기 쉬운 구조를 만들기 위해
  • 성능 향상을 위해
  • 안정성을 높이기 위해

🌟 리팩토링, 언제 해야 할까?

  • 에러가 n회 발견됐을 때
  • 반대로 리팩토링을 하면서 에러를 발견할 수 있음!
  • 기능을 추가하기 전에
  • 코드 리뷰할 때

다만 배포, 운영 직전에는 절대로 코드 수정이 일어나선 안된다.


🍋 youtuber-demo.js 업데이트(3)

🍎 전체 삭제

전체 유튜버 '삭제' → DELETE /youtubers

  • req : ❌
  • res : map 전체 삭제

따라서 다음과 같이 코드를 작성해준다.
(아주 쉽다. clear()만 해주면 된다.)

app.delete("/youtubers", (req, res) => {
  db.clear();

  res.json({
    message: "전체 유튜버가 삭제되었습니다.",
  });
});

🧃 그러나 만약 아무것도 없는 상황이라면?

예외사항(에러)은 아니다.

다만 처리를 해주면 코드가 더 정돈이 된다.

  • db에 값이 1개 이상이면 → 전체삭제
  • 값이 없으면 → 삭제할 유튜버가 없습니다. 날리기
app.delete("/youtubers", (req, res) => {
  if (db.size >= 1) {
    db.clear();
    res.json({
      message: "전체 유튜버가 삭제되었습니다.",
    });
  } else if (db.size === 0) {
    res.json({
      message: "삭제할 유튜버가 없습니다.",
    });
  }
});

결과는 다음과 같다.

1️⃣ 첫번째 전체 삭제 시도

2️⃣ 두번째 전체 삭제 시도

이후 개별조회로 데이터 삭제된 것을 확인해보면
모두 잘 처리 됐음을 확인할 수 있다.

🧃 클린코드 ver.

위의 코드를 좀 더 정돈해봤다.

app.delete("/youtubers", (req, res) => {
  var msg = "";
  if (db.size >= 1) {
    db.clear();
    msg = "전체 유튜버가 삭제되었습니다.";
  } else if (db.size === 0) {
    msg = "삭제할 유튜버가 없습니다.";
  }
  res.json({
    message: msg,
  });
});

🍋 youtuber-demo.js 업데이트(4)

🍎 개별 수정

개별 유튜버 '수정' → PUT /youtubers:id

  • req : params.id.body ⇐ channelTitle
  • res :${(이전)channelTitle} 님, 채널명이 ${(새로운)channelTitle}로 변경되었습니다.

이전 채널명과 새로운 채널명 구분을 위해
이전 채널명을 수정 전 위쪽에서 담아준다.

app.put("/youtubers/:id", (req, res) => {
  let { id } = req.params;
  id = parseInt(id);

  var youtuber = db.get(id);
  // ✨ 요렇게 담아주기!!!
  var oldChannelTitle = youtuber.channelTitle;

  if (youtuber === undefined) {
    res.json({
      message: `${id}로 가입된 정보가 없습니다.`,
    });
  } else {
    var newChannelTitle = req.body.channelTitle;

	// ✨ 이전의 채널명과 구분할 수 있습니당
    youtuber.channelTitle = newChannelTitle;
    db.set(id, youtuber);

    res.json({
      message: `${oldChannelTitle} 님, 채널명이 ${newChannelTitle}로 변경되었습니다.`,
    });
  }
});

채널명을 '유진캉' → '샤라랄라랄라라'로 바꿔보았다.


오늘은 여기까지!!

사실 http 상태 코드에 대해서도
설명을 해야하는데...

하루가 너무 고됐기때문에
(그리고 토이 프로젝트도 빨리 손봐야 함..)

이 글을 마무리하도록 하겠다!

끝!

profile
🐰🍎

0개의 댓글