데브코스

채널 api 설계 ( 생성, 조회, 삭제, 수정 )

hxx_1 2024. 9. 9. 16:49

1) 채널 생성 : POST /channels
- req : body (channelTitle)
- res 201 : ${channelTitle} 님 채널을 응원합니다.

let db = new Map()
let id = 1

app.route('/channels')
 .post(((req, res) => { // 채널 개별 생성 = db 에 저장
    if (req.body.channelTitle) {
      db.set(id++, req.body)

      res.status(201).json({
        message: `${db.get(id - 1).channelTitle} 채널을 응원합니다!`
      }
      )
    } else {
      res.status(400).json({
        message: "요청 값을 제대로 보내주세요."
      })
    }
  }))

왼) 요청값을 제대로 보냈을 때, 오) 값을 보내지 않았을 때

 

➡️ 제대로 된 값을 전달했을 경우 채널이 db에 저장되고, 상태코드 201 번과 함께 채널을 응원한다는 메시지가 나온다. body 에 값을 전달하지 않을 경우 상태코드 404 번과 함께 값을 제대로 보내달라는 메시지가 나온다.


2) 채널 개별 수정: PUT /channels/:id
- req: URL (id), body(channelTitle)
- res 200: `채널명이 성공적으로 수정되었습니다. 기존: ${} -> 수정:${}`

app
  .route('/channels/:id')
  .put(((req, res) => { // 채널 개별 수정
    let { id } = req.params
    id = parseInt(id)

    let channel = db.get(id)
    let oldTitle = channel.channelTitle

    if (channel) { // 객체가 있으면
      let newTitle = req.body.channelTitle
      channel.channelTitle = newTitle // 채널 이름 바꿔주기
      db.set(id, channel)

      res.status(200).json({
        message: `채널명이 정상적으로 수정되었습니다. 기존 ${oldTitle} -> 수정 ${newTitle}`
      })
    }
    else { // 객체가 없으면
      res.status(404).json({
        message: "채널 정보를 찾을 수 없습니다."
      })
    }

  }))

왼) 채널명 변경 성공, 오) 변경 후 채널 조회
없는 채널을 수정하려 했을 때

 

➡️URL 에 입력된 id 에 따른 객체를 찾는다. 해당 객체가 있을 경우, body 에 입력된 값에 따라 채널명이 변경되고, 상태코드 200과 함께 정상적으로 수정되었다는 메시지가 나온다. 해당 객체가 없을 경우, 상태코드 404와 채널 정보를 찾을 수 없다는 메시지가 나온다. 


3) 채널 개별 삭제: DELETE /channels/:id
- req: URL(id) 
- res 200: ` 삭제되었습니다 ` ➡️ 메인 페이지

 app
 .route('/channels/:id')
 .delete(((req, res) => { // 채널 개별 삭제
    let { id } = req.params
    id = parseInt(id)

    let channel = db.get(id)
    if (channel) { // 객체가 있으면
      db.delete(id)
      res.status(200).json({
        message: `${channel.channelTitle} 채널이 정상적으로 삭제되었습니다.`
      })
    }
    else { // 객체가 없으면
      res.status(404).json({
        message: "채널 정보를 찾을 수 없습니다."
      })
    }
  }))

왼) 있는 객체를 삭제하려고 했을 때, 오) 없는 객체를 삭제하려고 했을 때

 

➡️ URL 에 입력된 id 에 해당하는 객체가 있으면 db에서 삭제를 수행하고, 상태코드 200 과 함께 채널이 정상적으로 삭제되었다는 메시지를 보낸다. 해당하는 객체가 없을 경우, 상태코드 404와 함께 채널 정보를 찾을 수 없다는 메시지를 보낸다.

4) 채널 전체 조회: GET /channels
- req: X
- res 200 : 채널 전체 데이터 list, json array

app
  .route('/channels')
  .get((req, res) => { // 채널 전체 조회
    if (db.size) {
      let channels = []

      db.forEach(function (value, key) {
        channels.push(value)
      })
      res.status(200).json(channels)
    }
    else {
      res.status(404).json({
        message: "조회할 채널이 없습니다."
      })
    }
  })

왼) 전체 조회 수행 , 오) 조회할 채널이 없을 때

 

➡️db에 저장된 값이 있을 경우 상태코드 200과 함께 저장된 객체들이 화면에 나오고, 저장된 값이 없을 경우 상태코드 404와 함께 조회할 채널이 없다는 메시지가 나온다. 


5) 채널 개별 조회: GET /channels/:id
- req: URL(id)
- res 200: 채널 개별 데이터

app
  .route('/channels/:id')
  .get(((req, res) => { // 채널 개별 조회
    let { id } = req.params
    id = parseInt(id)

    let channel = db.get(id)
    if (channel) { // 객체가 있으면
      res.status(200).json(channel)
    }
    else { // 객체가 없으면
      res.status(404).json({
        message: "채널 정보를 찾을 수 없습니다."
      })
    }
  }))

왼) 객체가 있을 때 , 오) 객체가 없을 때

➡️ URL 에 입력된 id 에 해당하는 객체가 있으면 상태코드 200 과 함께 해당 객체가 나온다. 해당하는 객체가 없을 경우, 상태코드 404와 함께 채널 정보를 찾을 수 없다는 메시지가 나온다.


전체 코드

const express = require('express')
const app = express()
app.listen(7777)
app.use(express.json())

let db = new Map()
let id = 1

app
  .route('/channels')
  .get((req, res) => { // 채널 전체 조회
    if (db.size) {
      let channels = []

      db.forEach(function (value, key) {
        channels.push(value)
      })
      res.status(200).json(channels)
    }
    else {
      res.status(404).json({
        message: "조회할 채널이 없습니다."
      })
    }
  })
  .post(((req, res) => { // 채널 개별 생성 = db 에 저장
    if (req.body.channelTitle) {
      db.set(id++, req.body)

      res.status(201).json({
        message: `${db.get(id - 1).channelTitle} 채널을 응원합니다!`
      }
      )
    } else {
      res.status(400).json({
        message: "요청 값을 제대로 보내주세요."
      })
    }
  }))



app
  .route('/channels/:id')
  .get(((req, res) => { // 채널 개별 조회
    let { id } = req.params
    id = parseInt(id)

    let channel = db.get(id)
    if (channel) { // 객체가 있으면
      res.status(200).json(channel)
    }
    else { // 객체가 없으면
      res.status(404).json({
        message: "채널 정보를 찾을 수 없습니다."
      })
    }
  }))
  .put(((req, res) => { // 채널 개별 수정
    let { id } = req.params
    id = parseInt(id)

    let channel = db.get(id)

    if (channel) { // 객체가 있으면
      let newTitle = req.body.channelTitle
      let oldTitle = channel.channelTitle
      channel.channelTitle = newTitle // 채널 이름 바꿔주기
      db.set(id, channel)

      res.status(200).json({
        message: `채널명이 정상적으로 수정되었습니다. 기존 ${oldTitle} -> 수정 ${newTitle}`
      })
    }
    else { // 객체가 없으면
      res.status(404).json({
        message: "채널 정보를 찾을 수 없습니다."
      })
    }

  }))
  .delete(((req, res) => { // 채널 개별 삭제
    let { id } = req.params
    id = parseInt(id)

    let channel = db.get(id)
    if (channel) { // 객체가 있으면
      db.delete(id)
      res.status(200).json({
        message: `${channel.channelTitle} 채널이 정상적으로 삭제되었습니다.`
      })
    }
    else { // 객체가 없으면
      res.status(404).json({
        message: "채널 정보를 찾을 수 없습니다."
      })
    }
  }))

🌟 배운 점

오늘도 그동안 했던 API 설계를 반복하며 학습하였다. 오늘 학습을 통해 동일한 URL을 가진 경우, route를 사용해 경로를 합칠 수 있다는 것을 알게 되었다. 경로를 합치니 불필요한 반복을 줄일 수 있어서 좋은 것 같다. 직접 화면을 만들고 서버와 연결해보면 더 재미있을 것 같다. 강의를 보지 않고 나 혼자서도 똑같이 만들 수 있도록 복습을 해야겠다.