1️⃣ 진짜 유튜브를 운영하는 것처럼 만들어보자!: API 기획
2️⃣ 웹페이지 기획 시각화
로그인 페이지

회원가입 페이지

마이 페이지

3️⃣ 회원 API 설계
${name}님 환영합니다 👉 메인 페이지를 출력${name}님 환영합니다 👉 로그인 페이지를 출력${name}님 다음에 또 뵙겠습니다. OR 메인페이지 출력1️⃣ 회원 API 코드 틀
const express = require('express')
const app = express()
app.listen(7777)
// 로그인
app.post('/login', (req, res) => {
})
// 회원가입
app.post('/join', (req, res) => {
})
// 회원 개별 조회
app.get('/users/:id', (req, res) => {
})
// 회원 개별 탈퇴
app.delete('/users/:id', (req, res) => {
})
2️⃣ 회원가입 구현/회원 개별 조회, 회원 개별 삭제
const express = require('express')
const app = express()
app.listen(7777)
app.use(express.json()) //http 외 모듈 사용 'json 모듈'
let db = new Map()
var id = 1 // 하나의 객체를 유니크 하게 구별하기 위함,
// 로그인
app.post('/login', (req, res) => {
let id = req.params.id
})
// 회원가입
app.post('/join', (req, res) => {
console.log(req.body)
if (req.body == {}) {
res.status(400).json({
message : `입력 값을 확인해주세여`
})
} else {
db.set(id++, req.body)
res.status(201).json({
message : `${db.get(id-1).name}님 환영합니당`
})
}
})
app
.route('/users/:id') // 루트를 활용헤서 url이 같은 것을 묶을 수 있음
// 회원 개별 조회
.get((req, res) => {
let {id} = req.params // {}는 비구조화, id 값을 따로 빼서 사용
id = parseInt(id)
const user = db.get(id)
if (user == undefined) {
res.status(404).json({
message : '회원정보가 없어요'
})
} else {
res.json({
userId : user.userId,
name : user,name
})
}
})
// 회원 개별 탈퇴
.delete((req, res) => {
let {id} = req.params // {}는 비구조화, id 값을 따로 빼서 사용
id = parseInt(id)
const user = db.get(id)
if (user == undefined) {
res.status(404).json({
message : '회원정보가 없어요'
})
} else {
db.delete(id)
res.status(200).json({
message : `${user.name}님 다음에 볼께요`
})
}
})
1️⃣ 로그인 기본 로직 구현
app.post('/login', (req, res) => {
console.log(req.body) // userid, pwd
//userId가 db에 저장된 회원인지 확인해야
const {userId, password} = req.body
db.forEach((user, id) => {
if (user.userId/*user 안에 있는 id*/ === userId/*req.body 통해서 받은 값*/){
console.log("같음!!")
// pwd도 맞는지 비교
if (user.password === password) {
console.log("비번 같아")
} else {
console.log("비번 틀려")
}
}
})
})







2️⃣ 로그인 예외 처리
app.post('/login', (req, res) => {
console.log(req.body) // userid, pwd
//userId가 db에 저장된 회원인지 확인해야
const {userId, password} = req.body
let hasUserId = false
// hasUserId를 기본적으로 false로 선언하고 userId를 찾았을 때 true로 바꿔주면 됨
db.forEach((user, id) => {
if (user.userId/*user 안에 있는 id*/ === userId/*req.body 통해서 받은 값*/){
console.log("아이디 같음!!")
hasUserId = true
// pwd도 맞는지 비교
if (user.password === password) {
console.log("비번 같아")
} else {
console.log("비번 틀려")
}
}
})
// 위 코드에서 userId 값을 못 찾았다면
if(!hasUserId) {
console.log('입력한 아이디를 다시 확인해 주세요')
}
})


app.post('/login', (req, res) => {
console.log(req.body) // userid, pwd
//userId가 db에 저장된 회원인지 확인해야
const {userId, password} = req.body
let loginUser = {} // forEach에서만 사용하던 user를 다른 블록에서도 사용하기 위해 선언
// 또, 주의해야 할 점은 {}를 사용하면 전역변수가 되기 떄문에 비어있는 값도 값이 있는 것으로 인식하기 때문에 아이디가 없어도 있는 것으로 인지
db.forEach((user, id) => {
if (user.userId/*user 안에 있는 id*/ === userId/*req.body 통해서 받은 값*/){
// hasUserId = true loginUser를 만들고 나니 필요 없어짐
loginUser = user // user가 있다면 userfmf loginUser에 user를 담음
}
})
// 위 코드에서 userId 값을 못 찾았다면
if(loginUser) { // loginuser로도 user의 존재 여부를 알 수 있게 됨
console.log("아이디 같음!!")
if (loginUser.password === password) {
console.log("비번 같아")
} else {
console.log("비번 틀려")
}
} else {
console.log('입력한 아이디를 다시 확인해 주세요')
}
})
1️⃣ 빈 객체를 확인하는 방법 3가지
1. 객체: keys() // key값을 가져오게 되면
2. for in // for문은 안에 프로퍼티가 있나 없나 확인하는 법으로 객체 전체를 반복 순회하는 거라 비효율적
3. lodash: isEmpty // 누군가 만들어둔 라이브러리를 활용하는 법
2️⃣ Object.keys() 활용해보기
const obj1 = {}
const obj2 = {message : "use"}
console.log(Object.keys(obj1)) // length === 0, 배열길이가 0
console.log(Object.keys(obj2)) // length === 1, 배열길이가 1
// 배열길이가 있는지로 객체가 비어있는지 확인이 가능함
console.log(Object.keys(obj1).length === 0) // true로 반환
console.log(Object.keys(obj2).length === 0) // false로 반환
// 숫자나 문자열도 될까?
const num = 1
const str1 = 'one'
const str2 = '' // 문자열도 객체임!
console.log(Object.keys(num).length === 0) // true로 반환, 말이 안됨
console.log(Object.keys(str1).length === 0) // false로 반환, 문자열이 있다는 것이 적용이 됨
console.log(Object.keys(str2).length === 0) // true로 반환, 문자열이 없다는 것이 적용이 됨
// 함수를 모듈처럼 사용해본다면 아래와 같이 만들 수 있음
function isEmpty(obj) {
// 번외 if(obj.constructor === Object) 자바스크립트의 기본문법으로 객체인지 확인하는 방법
if(Object.keys(obj).length === 0){
return true;
} else {
return false;
}
}
console.log(isEmpty(obj1))
3️⃣ 로그인 고도화에 적용하기
if(Object.keys(loginUser).length) { // loginuser로도 user의 존재 여부를 알 수 있게 됨
console.log("아이디 같음!!")
if (loginUser.password === password) {
console.log("비번 같아")
} else {
console.log("비번 틀려")
}
} else {
console.log('입력한 아이디를 다시 확인해 주세요')
}
const express = require('express')
const app = express()
app.listen(7777)
app.use(express.json()) //http 외 모듈 사용 'json 모듈'
let db = new Map()
var id = 1 // 하나의 객체를 유니크 하게 구별하기 위함
// 존재한다는 의미로 exist를 사용한 함수를 만듦
function isExist(obj){
if (Object.keys(obj).length === 0) {
return true
} else {
return false
}
}
// 로그인
app.post('/login', (req, res) => {
console.log(req.body) // userid, pwd
//userId가 db에 저장된 회원인지 확인해야
const {userId, password} = req.body
let loginUser = {} // forEach에서만 사용하던 user를 다른 블록에서도 사용하기 위해 선언
// 또, 주의해야 할 점은 {}를 사용하면 전역변수가 되기 떄문에 비어있는 값도 값이 있는 것으로 인식하기 때문에 아이디가 없어도 있는 것으로 인지
db.forEach((user, id) => {
if (user.userId/*user 안에 있는 id*/ === userId/*req.body 통해서 받은 값*/){
// hasUserId = true loginUser를 만들고 나니 필요 없어짐
loginUser = user // user가 있다면 userfmf loginUser에 user를 담음
}
})
// 위 코드에서 userId 값을 못 찾았다면
if(isExist(loginUser)) { // loginuser로도 user의 존재 여부를 알 수 있게 됨
console.log("아이디 같음!!")
if (loginUser.password === password) {
console.log("비번 같아")
} else {
console.log("비번 틀려")
}
} else {
console.log('입력한 아이디를 다시 확인해 주세요')
}
})
1️⃣ 채널 API 설계(URL, http method/status, req/res)
${channelTitle}님 채널을 응원합니다 👉 채널 관리페이지 등 다른 페이지 띄워주기채널명이 성공적으로 수정되었습니다. 기존: ${}-> 수정: ${}삭제되었습니다. 👉 메인페이지로 이동2️⃣ 채널 생성페이지 기획 시각화
'마이 페이지'에 채널 관리 페이지 추가

채널 관리 페이지
개별 채널 삭제 API가 필요함
채널 생성 페이지

채널 개별 수정 페이지
개별채널 정보조회와 개별채널 수정 API가 필요함
1️⃣ 채널 API 코드 틀
const express = require('express')
const app = express()
app.listen(7778)
app // route로 URL 묶어주기
.route('/channels')
// 채널 개별 생성
.post((req, res) => {
res.json("개별생성")
})
// 채널 전체 조회
.get((req, res) => {
res.json("전체 조회")
})
app
.route('/channels/:id')
// 채널 개별 수정
.put((req, res) => {
res.json("개별수정")
})
// 채널 개별 삭제
.delete((req, res) => {
res.json("개별삭제")
})
// 채널 개별 조회
.get((req, res) => {
res.json("개별조회")
})
2️⃣ 채널 생성/전체조회/개별조회/개별수정/개별삭제
const express = require('express')
const app = express()
app.listen(7778)
app.use(express.json()) //http 외 모듈 사용 'json 모듈'
let db = new Map()
let id = 1
app // route로 URL 묶어주기
.route('/channels')
// 채널 개별 생성
.post((req, res) => {
if (req.body.channelTitle){
db.set(id++, req.body) // db에 값을 줄 때 id+1씩 적용
res.status(201).json({
message : `${db.get(id-1).channelTitle}채널을 응원합니다.₩`
})
} else {
res.status(400).json({
message : '요청 값을 제대로 보내주세요'
})
}
})
// 채널 전체 조회
.get((req, res) => {
let channels = [] // json array(배열 또는 리스트라 부름)를 만들어줌
if(db.size){ // db에 무엇이라도 있다면
db.forEach((value, key) => {// Map에서 하나씩 꺼내서 channels에 더해 줌
// channels[key] = value channels에 키값을 전달하면서 value를 추가
channels.push(value) // 리스트에 value를 하나씩 추가(push)해줌
})
// console.log(channels[0]) 배열의 인덱스를 활용해서 선택하여 가져올 수 있음
// console.log(channels[1])
// console.log(channels[2])
res.status(200).json(channels) // 여기서 이렇게 보내면 배열 안에 json형태로 잘 보내줌
} else {
res.status(404).json({
message : '아무것도 없는 걸요'
})
}
})
app
.route('/channels/:id')
// 채널 개별 조회
.get((req, res) => {
let {id} = req.params // req.params 객체에서 URL 경로에 포함된 id 값을 추출하여 id 변수에 저장
id = parseInt(id) // URL에서 문자열로 추출된 id를 정수로 변환
let channel = db.get(id) // 해당 id를 키로 하는 채널 정보를 channel 변수에 저장
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)
let oldTitle = channel.channelTitle // 올드 타이틀을 만들어줘야 차별화가 가능함
if(channel){
let newTitle = req.body.channelTitle // 뉴타이틀을 req.body의 channelTitle에서 가져옴
channel.channelTitle = newTitle // 가져온 것을 newTitle로 바꿔줌
db.set(id, channel) // 바꾼 것을 같은 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) // 해당 id를 키로 하는 채널 정보를 channel 변수에 저장
if(channel){
db.delete(id) // db에서 id를 삭제
res.status(200).json({
message : `${channel.channelTitle}님 정상적으로 삭제 되었습니다.` // 삭제되기 전 객체에서 꺼내와야 함
})
} else {
res.status(404).json({
message : `채널정보를 찾을 수 없습니다.`
})
}
})
