채널 api 설계 ( 생성, 조회, 삭제, 수정 )
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를 사용해 경로를 합칠 수 있다는 것을 알게 되었다. 경로를 합치니 불필요한 반복을 줄일 수 있어서 좋은 것 같다. 직접 화면을 만들고 서버와 연결해보면 더 재미있을 것 같다. 강의를 보지 않고 나 혼자서도 똑같이 만들 수 있도록 복습을 해야겠다.