프로젝트/개인 프로젝트 [세모이]
이벤트별 댓글삭제 API 개선
sungtt
2022. 3. 23. 18:42
개요
이벤트별 댓글을 삭제할 때 통신하는 api를 개선하게되었다.
기존에 쓰던 방법도 내 기준에서는 나름 효율적이라고 생각했는데,
코드를 더욱 줄이고 편해진 새로운 코드를 기록하려고한다.
기존 방법
기존에 사용하던 댓글 삭제 api는 클라이언트에게 URL에 담긴 브랜드명을 요청 받고,
switch문을 이용하여 브랜드명에 맞는 쿼리문이 실행되도록하였다.
이때 불편한 점은 댓글테이블과 코드의 양이 비례한다는것과,
스코프때문에 매번 쿼리문을 새로 작성해주어야한다는 것이다.
물론 쿼리문을 const가 아닌 let으로 선언하여 case에 따라 할당되는 값을 변경하는 방법도 있겠지만
코드가 늘어나는것은 매한가지였다.
//댓글 삭제 통합 api
app.post("/api/comment_del", (req,res) => {
let idx = req.body.idx;
let url = req.body.url;
switch (url){
case 'olive' :
const sqlQuery = "DELETE FROM oliveyoung_comment WHERE (`idx` = ?);";
db.query(sqlQuery, [idx]);
break;
case 'aland' :
const sqlQuery2 = "DELETE FROM aland_comment WHERE (`idx` = ?);";
db.query(sqlQuery2, [idx]);
break;
}
})
개선 방법
먼저 비밀번호 기능이 추가되었다. crypto-Js를 통해 sha256으로 단방향 암호화를 하였다.
개선된 코드는 테이블명을 규칙적으로 작명해놓았기때문에 가능한 일이었다.
클라이언트에서 브랜드명(brandName)을 받아와서 쿼리문에 변수로 할당하였다.
이제 어떤 이벤트컴포넌트든 브랜드명을 통해 쿼리문을 호출할 수 있게되어 코드가 확 줄었다.
주의할 점은 이벤트 컴포넌트에서 브랜드명이 담긴 prop을 전달해줘야만 한다.
이렇게 댓글을 삭제할때는 댓글의 index, 암호화된 password, 보고있는 이벤트의 브랜드명 brandName
세가지 데이터를 통해 작동하게된다.
//댓글 비밀번호와 브랜드명 확인 후 삭제 api
app.post("/api/comment_password_check", (req,res) => {
const idx = req.body.idx;
const password = req.body.hash;
const brandName = req.body.brandName;
const sqlQuery = `DELETE FROM ${brandName}_comment WHERE (idx = ?) AND (password = ?)`;
db.query(sqlQuery, [idx,password], (err,result) => {
console.log(result);
})
})