이번에는 삭제를 하는걸 해볼려고 한다.
기존에 만들었던 유튜브 데모에서 개별삭제와 전체삭제를 위한 api를 만들것이다.
그전에 전체 조회할때 사용한 forEach에 대해서 알아보고자 한다.
for + Each로 향상된 for문이다.
배열이나 객체에서 요소를 하나씩 꺼내어, 매개변수로 그 요소를 전달하여 콜백함수 로직대로 실행된다.
여기서 쓰이는 콜백 함수는 총 3개의 요소를 가질 수 있다.
1. 데이터
2. 인덱스
3. 전체
const arr = [1,2,3,4,5]
arr.forEach(function(a,b,c)=>{
// a는 데이터, b는 인덱스 값이다.
console.log(`a: ${a}, b: ${b}, c: ${c}`)
// a: 1, b: 0, c: 1,2,3,4,5
// a: 2, b: 1, c: 1,2,3,4,5
// a: 3, b: 2, c: 1,2,3,4,5
// a: 4, b: 3, c: 1,2,3,4,5
// a: 5, b: 4, c: 1,2,3,4,5
}
// Map과 forEach()의 만남
let map = new Map()
map.set(7,"seven")
map.set(9,"nine")
map.set(8,"eight")
map.forEach(function(a,b,c) {
console.log(`a: ${a}, b: ${b}, c: ${c}`)
});
// a: seven, b: 7, c: [object Map]
// a: nine, b: 9, c: [object Map]
// a: eight, b: 8, c: [object Map]
소프트웨어의 코드 내부(구조)를 변경하는 것,
기능을 추가하기 전에 만들어둔 것들이 잘 동작하는지 확인하는 것 또한 리팩토링이라고 할 수 있다.
1) 이해하기 쉽게 바꾸기
2) 성능적으로 개선하기
3) 프로그램의 안정성 높이기
...등등 여러가지가 있다.
리팩토링을 하면 안되는 시기는 베포, 운영 직전으로 그때는 절대 코드 수정이 일어나선 안된다!!
HTTP(인터넷 상에서 통신할 때 사용하는 규약)안에 작성되어서 들어가는 "상태"
이전에 조회, 전체조회, 생성등을 만들었으니 이제 삭제와 수정 api를 만들 차례다.
1) 개별 유튜버 "삭제" => DELETE /youtubers/:id
2) 전체 유튜버 "삭제" => DELETE /youtubers
3) 개별 유튜버 "수정" => PUT /youtubers/:id
🤔 메소드가 다르다지만, URL이 같아도 되는걸까?
같은 URL을 사용하더라도 메서드가 다르면 문제없으며, RESTful한 API에서는 오히려 권장한다고 한다.
🤔 try...catch문은 왜 안쓰는걸까?
프로젝트를 진행했을 때, 백엔드를 하는 친구의 코드에는 try...catch문이 많이 보였던걸 생각했을 때 지금 코드 짜는 것과는 차이가 나는거 같아서 if문과의 용도가 어떻게 다른지 찾아보았다.
=> 근데 직접 작성해보니까 db가 연결된게 아니라서 아직 사용하지 않아도 무관하다.
- try-catch가 적절한 경우
- 데이터베이스 접근 중 예외 발생 가능성이 있는 코드
(ex. 연결 오류, SQL 오류, 존재하지 않는 데이터 조회 등)- 비동기 코드 (async/await) 를 사용할 때
- 예상하지 못한 예외가 발생할 수 있는 경우
- if가 적절한 경우
- 예외가 아니라 논리적인 분기 처리가 필요한 경우
(ex데이터베이스에 SELECT 쿼리를 실행한 후 데이터가 없을 때 특정 처리를 해야 한다면 if가 적절)
처음에는 if문으로 작성한 것을 try...catch문과 res.status()를 추가하여 작성하였다.
...
// 개별 삭제
app.delete('/youtubers/:id', (req, res) => {
let {id} = req.params;
id = parseInt(id);
const youtuber = db.get(id);
if(youtuber!==undefined){
const channelTitle = youtuber.channelTitle;
db.delete(id);
res.json({
message: `${channelTitle}님, 아쉽지만 다음에 또 뵙겠습니다.`
})
} else {
res.json({
message: `요청하신 ${id}번은 없는 유튜버입니다.`
})
}
})
// 전체 삭제
app.delete('/youtubers', (req, res) => {
if (db.size >1){
db.clear()
// or
// db.forEach((a)=>{
// db.delete(a)
// })
res.json({
message: "전체 유튜버가 삭제되었습니다."
})
} else {
res.json({
message: "삭제할 유튜버가 없습니다."
})
}
})
...