DB를 이용하여 채널 개별 삭제하기
유효성 검사
param("id").notEmpty().withMessage("채널번호 필요")
채널 개별 삭제
let { id } = req.params;
id = parseInt(id);
const delete_sql = "delete from channels where id = ?";
try {
const [data] = await conn.query(delete_sql, id);
if (data.affectedRows == 0) {
return notFoundChannel(res);
}
res.status(200).json({
message: `그동안 유튜브를 이용해 주셔서 감사합니다.`
});
} catch (err) {
return res.status(400).end();
}
data.affectedRows가 0인 경우는 SQL내에 데이터가 없다는 뜻, 즉 id값 채널번호가 존재하지 않는것이기 때문에 notFoundChannel 함수를 불러오고, 그외에는 존재하기 때문에 성공처리르 하여 message를 던져주게 하였습니다.
이전 코드 정리
DB 구성
db = {
idx,
{
user : test1,
channels :[
{channelTitle : '테스트', description : '채널설명', channelId : 번호}
]
}
}
기본 코드 작성
app
.route("/channels/:user/:num")
.delete((req, res) => {
let { user, num } = req.params;
num = parseInt(num);
let hasUser = false;
let userKey = "";
db.forEach((value, key) => {
if (value.user === user) {
userKey = key;
hasUser = true;
}
});
// 유저의 채널 배열만 분리
const userChannels = db.get(userKey).channels;
res.status(200).json({
message: `${userData.channelTitle}님 그동안 유튜브를 이용해 주셔서 감사합니다.`
});
})
채널 개별 조회를 했으니 채널 개별 삭제를 해보려고 합니다. URI를 통해서 user와 채널번호를 받아오게 하였고 이때 유저의 존재 유무를 판단하기 위한 hasUser와 user의 key값을 받아오기 위한 userKey를 forEach문으로 값을 받아오고, 유저의 채널만 따로 분리를 하였습니다.
Check 사항
1. 유저가 존재하는가?
2. num과 userData의 channelId와 일치하는가?
1. 유저가 존재하는가?
if (!hasUser) {
res.status(404).json({
message: "존재하지 않는 유저입니다."
});
return;
}
user가 있는지 확인하기 위해 hasUser를 이용하였습니다. 존재하지 않는 경우에 리소스를 찾을 수 없는 상태코드 404를 전달해 주고 존재하지 않는 유저라는 메시지도 같이 json형태로 전달을 하였습니다.
2. num과 userData의 channelId와 일치하는가?
const userData = userChannels.find((i) => {
if (num === i.channelId) {
return i;
} else {
return false;
}
});
if (!userData) {
res.status(404).json({
message: "존재하지 않는 채널입니다."
});
return;
}
user가 존재할때 userChannels에서 find함수로 num가 i(channels)의 channelId와 일치하는지 확인하고 맞으면 i (일치한 객체)를 return 해주고 아니라면 false를 반환하게 하였습니다.
이때 userData가 false일 때 404 상태코드와 존재하지 않는 채널이라고 메시지를 전달해 주도록 하였습니다.
데이터 삭제
데이터를 삭제하는 방법에 대해서 고민을 해보았습니다. Map 객체 안에 value값 안에 또 다른 배열 객체였기 때문인데요.
그리고 초기 DB 구성에는 channelId가 없었는데요 때문에 channels의 index값을 받아와야 했습니다.
1) delete db.get(userKey).channels[num]으로 데이터를 삭제
문제 발생 : delete를 사용하게 되면 새로운 채널을 만들 때 에러가 발생하고, db를 확인하면 아래와 같이 <1 empty item>이 생기게 된다.
2) userChannels.splice(num, 1)로 데이터 삭제
문제 발생 : splice로 제거를 하면 객체가 깔끔하게 제거가 되지만 index값이 수시로 변경되는 것을 확인
ex _
index 0 {channelTitle : '테스트채널1', description : '테스트 채널 설명'}
index 1 {channelTitle : '테스트채널2', description : '테스트 채널 설명'}
index 2 {channelTitle : '테스트채널3', description : '테스트 채널 설명'}
→ index1번 삭제, 후 결과
index 0 {channelTitle : '테스트채널1', description : '테스트 채널 설명'}
index 1 {channelTitle : '테스트채널3', description : '테스트 채널 설명'}
3) 채널 데이터에 고유 채널번호를 넣고 splice를 통해 제거
userChannels.forEach((v, i) => {
if (v.channelId === num) {
userChannels.splice(i, 1);
}
});
db.get(userKey).channels = userChannels;
위의 두 문제를 해결할 수 있었지만 다시 channels에 배열을 대입시켜줘야 하는 불편함이 남아있습니다.
'프로젝트 > 1.youtube-project' 카테고리의 다른 글
[실전]미니 프로젝트 - 채널 전체 "조회" (0) | 2023.12.16 |
---|---|
[실전]미니 프로젝트 - 채널 개별 "수정" (0) | 2023.12.15 |
[실전]미니 프로젝트 - 채널 개별 "조회" (0) | 2023.12.14 |
[실전]미니 프로젝트 - 채널 "생성" (0) | 2023.12.14 |
[실전]미니 프로젝트 - 로그인 (0) | 2023.12.14 |