지난 시간에 이어서~
전체조회 기능을 만들어보자!
전체 유튜버 '조회' → GET /youtubers
- req: ❌
- res: map 전체 조회
values를 사용하면 콘솔에는 값이 보이나 Body에는 보이지 않는다.
이는 map 형태를 json으로 바로 던져주지 못하기 때문이다.
app.get("/youtubers", (req, res) => { console.log(db.values()); res.json(db.values()); });
function으로 키 값과 value 값을 받아서
json으로 던져주면
var youtubers = {};
app.get("/youtubers", (req, res) => {
db.forEach((value, key) => {
youtubers[key] = value;
});
res.json(youtubers);
});
전체 조회 기능 완성 ✨
1️⃣ 매개변수가 1개 → value
2️⃣ 매개변수가 2개 → value, index
3️⃣ 매개변수 3개 → value, index, 객체 전체
index 크기에 상관없이 작성한 순서대로 배열됨을 알 수 있다.
아래 사진을 보면 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으로는 가능함을 알 수 있다.
개별 유튜버 '삭제' → DELETE /youtubers/:id
${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회 발견됐을 때
- 반대로 리팩토링을 하면서 에러를 발견할 수 있음!
- 기능을 추가하기 전에
- 코드 리뷰할 때
❌ 다만 배포, 운영 직전에는 절대로 코드 수정이 일어나선 안된다. ❌
전체 유튜버 '삭제' → DELETE /youtubers
따라서 다음과 같이 코드를 작성해준다.
(아주 쉽다. 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️⃣ 두번째 전체 삭제 시도
이후 개별조회로 데이터 삭제된 것을 확인해보면
모두 잘 처리 됐음을 확인할 수 있다.
위의 코드를 좀 더 정돈해봤다.
app.delete("/youtubers", (req, res) => { var msg = ""; if (db.size >= 1) { db.clear(); msg = "전체 유튜버가 삭제되었습니다."; } else if (db.size === 0) { msg = "삭제할 유튜버가 없습니다."; } res.json({ message: msg, }); });
개별 유튜버 '수정' → PUT /youtubers:id
${(이전)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 상태 코드에 대해서도
설명을 해야하는데...
하루가 너무 고됐기때문에
(그리고 토이 프로젝트도 빨리 손봐야 함..)
이 글을 마무리하도록 하겠다!
끝!