Express에서 POST 요청하기 - DELETE,PUT

wltjd1688·2025년 2월 18일

풀사이클

목록 보기
19/74

이번에는 삭제를 하는걸 해볼려고 한다.
기존에 만들었던 유튜브 데모에서 개별삭제와 전체삭제를 위한 api를 만들것이다.

그전에 전체 조회할때 사용한 forEach에 대해서 알아보고자 한다.

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에서 forEah써보기

// 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) 프로그램의 안정성 높이기
...등등 여러가지가 있다.

리펙토링 해야하는 시기

  • 에러가 n회 발생되었을 때
  • 리팩토링을 하면서, 에러(문제점)을 발견할 수 있다.
  • 기능을 추가하기 전
    ex. API URL "설계"
  • 코드 리뷰할 때

리팩토링을 하면 안되는 시기베포, 운영 직전으로 그때는 절대 코드 수정이 일어나선 안된다!!


http code

HTTP(인터넷 상에서 통신할 때 사용하는 규약)안에 작성되어서 들어가는 "상태"

  • 조회/수정/삭제 성공: 200
  • 등록 성공: 201
  • 찾는 페이지가 없을때(url에 맞는 api가 없음): 404
  • 서버가 죽었을 때(서버가 크리티컬한 오류를 맞았을 때): 500

삭제 및 수정 API 설계

이전에 조회, 전체조회, 생성등을 만들었으니 이제 삭제와 수정 api를 만들 차례다.

1) 개별 유튜버 "삭제" => DELETE /youtubers/:id

  • req: parames.id
  • res: "${channelTitle}님, 아쉽지만 다음에 또 뵙겠습니다.

2) 전체 유튜버 "삭제" => DELETE /youtubers

  • req: X
  • res: "전체 유튜버가 삭제되었습니다."

3) 개별 유튜버 "수정" => PUT /youtubers/:id

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

🤔 메소드가 다르다지만, 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: "삭제할 유튜버가 없습니다."
        })
    }
})
...
profile
일단 해!!!!

0개의 댓글