[프로그래머스 데브코스 풀스택] 2026-01-27 TIL foreach문, map 함수, 리팩토링, HTTP 상태 코드

 

// ... 생략

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