1️⃣ API설계 수정: 전체 조회를 API에 적용해보기

app.get("/youtubers", (req, res) => {
res.json(db)
console.log(db)
})
전체조회를 추가해봤지만 postman에서 res을 못 받아옴, 하지만 콘솔로그에서는 잘 표기가 됨
콘솔로그에서 나오는 값을 확인하면 map형태가 json과 동일하지 않은 것을 확인할 수 있음, 메소드를 활용하여 json으로만 가져오도록 코드를 수정해야 됨


db.values 를 사용해봤는데도 중괄호로 둘러쌓여 있어서 json으로 인식하지 못함
app.get("/youtubers", (req, res) => {
res.json(db.values)
console.log(db.values)
})

app.get("/youtubers", (req, res) => {
db.forEach((youtuber) => {
console.log(youtuber)
})
})

app.get("/youtubers", (req, res) => {
let youtubers = {} // 변수를 json 형태로 변환
db.forEach((value, key) => { // 매개변수로 value, key를 각각 넣어줌
youtubers[key] = value
})
res.json(youtubers)
})
이 방법은 이전에 해본 방법에서 대괄호를 찾아볼 수 있음
app.get('/:id', function (req, res) {
let {id} = req.params
id = parseInt(id) // "숫자" -> 정수
if (db.get(id) == undefined){
res.json({
message : "없는 상품이네영"
})
} else {
product = db.get(id)
product.id = id // 객체를 이런식으로 추가할 수 있음
product["id"] = id // 배열처럼 대괄호로 추가함, 배열 중 "id"를 id 로 바꿈
res.json(product) // 위에서 db에서 가져오는 id를 product로 선언하여 간편해짐
}
})
아래와 같이 수정하여 사용할 수도 있음
app.get("/youtubers", (req, res) => {
let youtubers = {} // 변수를 json 형태로 변환
db.forEach((youtuber) => { // value, key를 각각 넣어주는 대신 변수를 그대로 넣어도 됨
youtubers[youtuber.channel] = youtuber // 아래도 마찬가지고 변경해줄 수 있음
res.json(youtubers)
})

1️⃣ forEach문이란?
const arr = [1, 2, 3, 4, 5]
arr.forEach(
(a) => {
console.log(a)
}
// 선택한 객체(arr)또는 배열에서 요소를 하나 꺼낸 다음
// 매개변수(a)로 그 요소를 전달하여 호출되는 콜백함수
)
arr.forEach(
(a, b, c) => {
// 매개변수의 첫번째는 value, 두번째는 index, 세번째는 값 전부인 것을 알 수 있음
console.log(`a : ${a}, b : ${b}, c : ${c}`)
}
// a값과 b값을 템플릿 문자열을 사용해서 출력하면
// a : 1, b : 0, c : 1,2,3,4,5 로 a는 값, b는 인덱스, c는 통째로 출력함
)
2️⃣ 그렇다면 map 객체에서는 어떻게 꺼내 쓰는 것일까?
let map = new Map()
map.set(7, "seven")
map.set(9, 'nine')
map.set(8, 'eight')
map.forEach((a, b, c) => {
console.log(`a : ${a}, b : ${b}, c : ${c}`)
// a는 value, b는 key, c는 객체 가 출력되는 것을 알 수 있음
})
// 아래와 같이 결과가 나오는 것을 볼 수 있음
// a : seven, b : 7, c : [object Map]
// a : nine, b : 9, c : [object Map]
// a : eight, b : 8, c : [object Map]
// map을 json방식으로 가져올 때 key, value의 위치가 왜 이런 지 알 수 있게 됨
app.get("/youtubers", (req, res) => {
let youtubers = {}
db.forEach((value, key) => {// value, key를 순서대로 넣어줌
youtubers[key] = value
})
res.json(youtubers)
})

🧐 추가적으로 내가 궁금한 것: youtubers의 요소 key를 value로 선언하는 것일까?
db.set("pewdiepie", { subscribers: 110000000 });
db.set("h3h3", { subscribers: 6000000 });
{
pewdiepie: { subscribers: 110000000 },
h3h3: { subscribers: 6000000 }
}
1️⃣ map함수란?
const numbers = [1, 2, 3, 4];
const squared = numbers.map(num => num * num);
console.log(squared); // 출력: [1, 4, 9, 16]
// 이 코드에서 map 함수는 numbers 배열의 각 숫자를 제곱하고, 그 결과를 squared 배열에 저장함
2️⃣ forEach VS map
const arr = [1, 2, 3, 4, 5]
const forarr = arr.forEach(
(a, b, c) => {
return a *2
}
)
console.log(forarr) // undefined 라는 결과가 나오고 forEach는 리턴을 하지 않음
const maparr = arr.map(
(a, b, c) => {
return a *2
}
)
console.log(maparr) // [ 2, 4, 6, 8, 10 ], map은 return을 하고 새로운 arr를 만들어줌
1️⃣ API설계 수정: delete(삭제)를 API에 적용해보기
2️⃣ 코드에 delete를 적용해보자
// express 모듈 세팅
const express = require('express')
const app = express()
app.listen(2223)
// 데이터 세팅
let youtuber1 = {
channelTitle : "조코딩",
sub : "609k",
videonum : "111개"
}
let youtuber2 = {
channelTitle : "침착맨",
sub : "2270k",
videonum : "6600개"
}
let youtuber3 = {
channelTitle : "아무개",
sub : "300k",
videonum : "50개"
}
let db = new Map() // key : value 쌍으로 생김, json과 비슷한 형태
let id = 1
db.set(id++, youtuber1) // 하나씩 더해주는 값으로 등록을 하게 됨
db.set(id++, youtuber2)
db.set(id++, youtuber3)
// 전체조회
app.get("/youtubers", (req, res) => {
let youtubers = {} // 변수를 json 형태로 변환
db.forEach((value, key) => { // 매개변수로 value, key를 각각 넣어줌
youtubers[key] = value
})
res.json(youtubers)
})
// 개별조회
app.get('/youtubers/:id', function (req, res){
let {id} = req.params
id = parseInt(id) // id를 그냥 쓰면 숫자가 아닌 문자열로 받기 때문에 정수로 바꿔줌
const youtuber = db.get(id) // youtuber 로 db.get을 정리하여 중복을 없앰(가독성 증가)
if (youtuber == undefined) {
res.json({
message : "정보를 찾을 수 없습니다"
})
} else {
res.json(youtuber)
}
})
// 등록
app.use(express.json()) // http 외 모듈인 '미들웨어' 중 json 설정
app.post('/youtubers', (req, res) => {
console.log(req.body)
db.set(id++, req.body) // id를 1이라 선언하고 등록할 때마다 하나씩 더하게 만들면 중복되지 않고 저장이 됨
res.json({message : `${db.get(id-1).channelTitle}님, 유튜브 가입을 축하합니다`})
// id를 그대로 불러오면 위에서 id++로 더한 값을 res하기 때문에 1을 빼줘야 정상적으로 불러옴
})
// 삭제
app.delete('/youtubers/:id', (req, res) => {
let {id} = req.params
id = parseInt(id)
const name = db.get(id).channelTitle // db에서 id(의 title)를 가져옴
db.delete(id)
res.json({
message : `${name}님, 아쉽지만 다음에 뵙겠습니다.`
})
})
1️⃣ 예외처리로 안정성을 확보해보자
app.delete('/youtubers/:id', (req, res) => {
let {id} = req.params
id = parseInt(id)
let youtuber = db.get(id)
// 어제 const channelTitle를 여기다 적으니 오류가 남 왜일까?
// 블록 스코프 때문이었음, 선언 블록과 실행 블록이 맞지 않았기 때문임
if (youtuber == undefined) { // db에서 id를 꺼내 있는지 확인
res.json({
message : `요청하신 ${id}의 정보를 찾을 수 없습니다`
})
} else {
const channelTitle = youtuber.channelTitle // 앞에서 db.get(id)를 하기 때문에 유튜버 변수 만듬
db.delete(id)
res.json({
message : `${channelTitle}님, 아쉽지만 다음에 뵙겠습니다.`
})
}
})
1️⃣ 리-팩토링(소프트웨어의 코드 구조를 변경하는 것)의 목적
2️⃣ 리팩토링은 언제 해야 하나?
❌ 그럼 언제 하면 안되는가? : 배포 및 운영 직전에는 절대로 코드 수정이 일어나선 안됨!
1️⃣ API설계 수정: 전체 유튜버 delete
2️⃣ 전체 삭제 기능을 추가
app.delete('/youtubers', (req, res) => {
// db에 값이 1개 이상이면 삭제하고 값이 없다면 안내문 표출
let msg = ""
// 메시지를 json으로 보내는 것도 반복되니 변수로 따로 만들어 줄 수 있음
if (db.size >= 1) { // db의 값이 1보다 크면 이라는 것은 데이터의 수를 나타냄
db.clear() // db의 모든 것을 깨끗히 지워줌
msg = "모든 유튜버가 삭제되었습니다."
} else {
msg = "삭제할 유튜버가 없습니다."
}
res.json({
message : msg // msg가 최종 결정 및 보내지는 위치와 변수의 선언 위치가 같은 블록이므로 에러 안남
})
})

1️⃣ API설계 수정: 개별 유튜버 수정
2️⃣ PUT으로 수정을 추가해보자
app.put("/youtubers/:id", (req, res) => { // put은 덮어쓰기를 함
let {id} = req.params
id = parseInt(id)
let youtuber = db.get(id)
let oldTitle = youtuber.channelTitle // 현재 블록에서 채널타이틀을 old로 선언해야 변경 이후에도 사용할 수 있음
if (youtuber == undefined) {
res.json({
message : `요청하신 ${id}의 정보를 찾을 수 없습니다`
})
} else { // 해당 블록 내에서 채널타이틀 수정
let newTitle = req.body.channelTitle
// 뉴타이틀을 가져온 body의 채널 타이틀(postman의 put에서 body의 raw에 json으로 입력된 값)로 선언
youtuber.channelTitle = newTitle // 뉴타이틀을 현재 블록 내의 채널 타이틀로 선언(현재 채널타이틀이 변경됨)
db.set(id, youtuber) // key값으로 id를 정해주고 객체인 youtuber 지정하여 db에 덮어쓰기
res.json({
message : `${oldTitle}님, 채널명이 ${newTitle}님으로 변경되었습니다.`
})
}
})

1️⃣ HTTP(인터넷 통신시 사용하는 규약)안에 작성되어 들어가는 "상태"