// ... 생략
let db = new Map()
var id = 1
db.set(id, youtuber1) // 키로 벨류를 찾을 수 있는 한 쌍을 저장
db.set(id++, youtuber2)
db.set(id++, youtuber3)
app.get('/youtubers', function(req, res){
console.log(db)
res.json(db)
})
//... 생략
db는 map 형태이기 때문에, json 현태로 바로 던져줄 수 없음.
💡 foreach을 사용해보자.
app.get('/youtubers', function(req, res){
var youtubers = {} // 클리어 코드에서는 변수명에 데이터형태 넣지 않음.
db.forEach(function(value, key){
youtubers[key] = value
});
res.json(youtubers)
})
foreach란?
for + each "향상된/개선된 for 문"
arr.forEach(function(데이터, 인덱스, 객체 통째로){
})
배열에서의 foreach
const arr = [1,2,3,4,5]
//객체(또는 배열)에서 요소를 하나 꺼낸 다음
//매개변수로 그 요소를 전달하여 호출되는 콜백함수
arr.forEach(function(a, b, c){
console.log(`a: ${a}, b: ${b}, c : ${c}`)
})

map에서의 foreach
// Map과 foreach의 만남
let map = new Map()
map.set(1, "sevent")
map.set(2,"nine")
map.set(3,"eight")
map.forEach(function(a, b, c) {
console.log(`a : ${a}, b : ${b}, c : ${c}`)
})

👉🏻 똑같이 활용됨
map 함수 vs foreach
//map 함수(메서드) vs foreach 차이
const arr = [1,2,3,4,5]
//객체(또는 배열)에서 요소를 하나 꺼낸 다음
//매개변수로 그 요소를 전달하여 호출되는 콜백함수
const foreachArr = arr.forEach(function(a, b, c){
return a * 2
})
const mapArr = arr.map(function(a, b, c){
return a * 2
})
console.log(`foreach로 return하면 ${foreachArr},
map으로 return하면 ${mapArr}`)

foreach는 리턴하지 않음.
map은 새로운 배열을 만들어서 리턴해줌.
https://ilove-ya.tistory.com/119
<API 설계(URL, method) - 개별 유튜버 삭제>
DELETE를 활용해서 유튜버를 삭제해보자.
0) 전체 유튜버 "조회" GET /youtubers
- req : X
- res : map을 전체 조회
1) 개별 유튜버 "조회" GET /youtubers/:id : id로 map에서 객체를 찾아서, 그 객체의 정보를 뿌려줌
- req : params.id <= map 에 저장된 Key값을 전달
- res : map에서 id로 객체를 조회해서 전달
2) 유튜버 등록 => POST /youtubers
- req : body <= channelTitle, sub = 0, videoNum =0 신규 유튜버 정보를 전달, db에 저장까지 해줌
- res : "channelTitle님, 유튜버 생활을 응원합니다!"
++
3) 개별 유튜버 "삭제" => DELETE /youtubers/:id : 조회와 url이 같아도, 메소드가 다르기 때문에 괜찮음.
- req: params.id
- res: "channelTitle님, 아쉽지만 다음에 또 뵙겠습니다."
app.delete('/youtubers/:id', function(req, res){
let {id} = req.params
id = parseInt(id)
var youtuber = db.get(id)
if(youtuber == undefined){
res.json({
message : `요청하신 ${id}번은 없는 유튜버입니다.`
})
}
else {
const channelTitle = youtuber.channelTitle
db.delete(id)
res.json({
message : `${channelTitle}님, 아쉽지만 우리 인연은 여기까지 인가요..`
})
}
})
💡 예외처리 => 안정성을 가져오기 때문에, 꼭 고려해주어야함
🤔 리팩토링이란?
: 나쁜 코드 -> 클린 코드
소프트웨어의 코드 내부(구조)를 변경하는 것
1) 이해하기 쉽게
2) 성능
3) 안정성
...
언제해야할까?
1. 에러(문제점)이 n회 발견되었을 때, 리팩토링을 해야한다.
2. 리팩토링을 하면서, 에러(문제점)을 발견할 수 있다.
3. 기능을 추가하기 전, ex. API URL "설계"
4. 코드 리뷰할 때,
✨ 배포, 운영 직전✨ 에는 절대로 코드 수정이 일어나선 안됨!!
<API 설계(URL, method) - 전체 유튜버 삭제>
++
4) 전체 유튜버 "삭제" => DELETE /youtubers
- req : X
- res : "전체 유튜버가 삭제되었습니다."
app.delete('/youtubers', function(req, res){
var msg = ""
// db에 값이 1개 이상이면, 전체 삭제
if(db.size >= 1){
db.clear()
msg = "전체 유튜버가 삭제되었습니다."
}
else{ // 값이 없으면,
msg = "삭제할 유튜버가 없습니다."
}
res.json({
message : msg
})
})
<API 설계(URL, method) - 개별 유튜버 수정>
++
5) 개별 유튜버 "수정" => PUT /youtubers/:id
- req : params.id, body <= channelTitle
- res : "(이전)channelTitle님, 채널명이 (새로운)channelTitle 변경되었습니다."
app.put('/youtubers/:id', function(req, res){
let {id} = req.params
id = parseInt(id)
var youtuber= db.get(id)
var oldTitle = youtuber.channelTitle
if(youtuber == undefined){
res.json({
message : `요청하신 ${id}번은 없는 유튜버입니다.`
})
} else {
var newTitle = req.body.channelTitle
youtuber.channelTitle = newTitle
db.set(id, youtuber)
res.json({
message : `${oldTitle}님, 채널명이 ${newTitle}으로 수정되었습니다.`
})
}
})
HTTP 상태 코드
HTTP(인터넷 상에서 통신할 떄 사용하는 규약) 안에 작성되어서 들어가는 "상태"
https://namu.wiki/w/HTTP/%EC%9D%91%EB%8B%B5%20%EC%BD%94%EB%93%9C
HTTP/응답 코드
HTTP 응답 코드를 정리하는 문서. MDN Web Docs 나 2024년 9월 현재 최신 문서인 RFC 9
namu.wiki
- 2** : 성공
1) 조회/수정/삭제 성공 : 200
2) 등록 성공 : 201
- 4** : 클라이언트 잘못
1) 찾는 페이지 없음(url에 맞는 api 없음): 404
2) 서버가 죽었을 떄 (서버가 크리티컬한 오류를 맞았을 때) : 500
- 5** : 서버 잘못
1) 서버가 죽었을 때(서버가 크리티컬한 오류를 맞았을 떄 ) : 500

'Devcourse' 카테고리의 다른 글
| <프로그래머스 데브코스 풀스택>2026-01-28 TIL 미니프로젝트 (1) | 2026.01.28 |
|---|---|
| <프로그래머스 데브코스 풀스택> 2026-01-27 TIL(2) 핸들러, 예외처리, == vs === (0) | 2026.01.28 |
| <프로그래머스 데브코스 풀스택> 2026-01-26 TIL (0) | 2026.01.25 |
| <프로그래머스 데브코스 풀스택> 2026-01-23 TIL (0) | 2026.01.23 |
| [프로그래머스 데브코스 풀스택] 2026-01-22 TIL (0) | 2026.01.21 |