https://myeongsu0257.tistory.com/225
유튜브를 보면 한유저(회원)이 가질 수 있는 채널은 여러개입니다. 따라서 채널을 여러개 가질 수 있도록 설계해보겠습니다. 그러기위해서 ERD를 그려보겠습니다.
회원테이블입니다.
user_id | password | name |
testId1 | 1234 | tester1 |
testid2 | 5678 | tester2 |
채널테이블입니다. 회원테이블의 user_id를 사용해주었습니다.
id | channel_Title | user_id | sub_num | video_num |
1 | 최튜브 | testId1 | ||
2 | 최튜브2 | testId1 | ||
3 | 김튜브 | testId2 | ||
위의 테이블을 만들어보면 현재 api를 여러개 수정해주어야합니다. 예를들면 전체채널조회api에서 회원이 소유한 채널들만 보여주는 것, 채널을 생성할때 어떤 유저가 생성하는지 등 수정을 해줘야합니다.
리팩토링 api
채널
- 채널생성 : POST /channels -> 이전설계때는 body에 title만 받았었음
- req : body(channelTitle) -> body (channelTitle, userId) cf. userId는body가아닌 header에 숨겨서 받아야한다.(JWT)
- res : 201 : ...
- 채널 전체 조회 : GET /channels -> 이전설계때는 body에 아무것도 없었음
- req : X -> body(userId)
- res : 200 ...
회원
- 회원 개별 조회 : GET /users/:id -> /users
- req : URL(id) -> body(id)
- res :동일
- 회원 개별 탈퇴 : DELETE /users
- req : URL(id) -> body(id)
- res : 동일
채널
채널생성
먼저채널생성입니다. 사실 수정된 채널생성은 코드를 수정할 필요는 없습니다. 단순히 body에 userId만 실어서 같이 보내면 됩니다.
//채널 개별 생성
.post((req, res) => {
console.log('채널생성');
if (Object.keys(req.body).length) {
let channel = req.body
db.set(id++, channel)
res.status(201).json({
message: `${req.body.channelTitle}님 채널을 응원합니다.`
})
}
else {
res.status(400).json({
message: `채널명을 확인해주세요`
})
}
})
전체채널조회
문제는 채널전체조회입니다. 현재 db(데이터베이스)에 실제로 값을 저장하는 것이 아니기때문에 실질적인 유저id가 같은지의 검사는 하지 못하고 임시로 진행하겠습니다. 따라서 body에 유저의 id를 실어서 보내주면 forEach문을 돌때 방금 보낸 유저의 id와 생성된채널들(db 맵객체)의 유저 id와 같으면 push 해주었습니다.
//채널 전체 조회
.get((req, res) => {
if (db.size >= 1) {
let {id}=req.body
let channel = [];
db.forEach((value, index) => {
if(id==value.id)
{
channel.push(value);
}
})
res.status(200).json(channel)
}
else {
res.status(404).json({
message: `채널이 없습니다 `
})
}
})
postman에서 회원가입을 한 후 채널을 3개정도만들고 채널을 만든 유저의id로 전체채널조회를 해보면 방금만든 채널들이 나옵니다.
여기서 body에 아무것도 실지 않고 보내는 경우, body에 현재 이상한 id를 보내는 경우 둘다 200상태드와 함께 빈 배열을 리턴합니다.
이 2가지의 경우에 대해 예외처리 해주겠습니다.
예외처리
- userId가 body에 없으면
- userId가 가진 채널이 없으면
먼저 userId가 body에 없는 경우입니다. id가 없는 경우는 로그인을 다시해달라는 요청의 메시지를 보내주어야합니다.
그래서 아래처럼 if문으로 id가 undefined일 경우 예외처리해주었습니다.
.get((req, res) => {
if (db.size >= 1) {
let { id } = req.body
let channel = [];
if (id == undefined) {
res.status(404).json({
message: `로그인이 필요한 페이지입니다. `
})
}
else { ....
회원
회원개별조회
회원개별조회입니다. id를 body로 받게수정하고 해당 id가 db에 저장되어있는 값들 중 어떤 하나의 값이랑 id가 같아 user가 있으면 200을 없으면 404를 해주었습니다. 그리고 body에 id 값이 없으면 400상태코드를 해주었습니다.
.get((req, res) => {
let { id } = req.body;
if (id) {
let user = undefined
db.forEach((value,index)=>{
if(value.id==id)
{
user=value
}
})
if(user){
res.status(200).json({
userId: user.id,
name: user.name
})
}
else{
res.status(404).json({
message: `해당 회원이 없습니다.`
})
}
}
else {
res.status(400).json({
message: `입력값을 다시 확인해주세요.`
})
}
})
회원개별삭제
회원개별삭제입니다. get과 마찬가지로 id를 body로 받고 삭제하고자 하는 user가 있으면 200을 없으면 404를 마지막으로 body에 값이 없으면 400 예외처리를 해주었습니다.
.delete((req, res) => {
let {id} = req.body;
if(id)
{
let user = undefined
db.forEach((value,index)=>{
if(value.id==id)
{
user=value
}
})
if (user) {
db.delete(id);
res.status(200).json({
message: `${user.name}님 다음에 또 뵙겠습니다. 메인페이지`
})
}
else {
res.status(404).json({
message: `해당 회원이 없습니다.`
})
}
}
else{
res.status(400).json({
message: `입력값을 다시 확인해주세요.`
})
}
})
결과
먼저 "choi"라는 id로 회원가입을 진행한 후 조회 삭제 실행해보면
조회
유저 삭제
'백엔드 > node.js(express)' 카테고리의 다른 글
토이프로젝트 유튜브3(DB생성,express-db연동,db모듈화) (0) | 2023.12.20 |
---|---|
Docker MariaDB db생성 및 테이블생성(삽입,수정,join) (0) | 2023.12.19 |
토이프로젝트 유튜브1(회원API설계), router (0) | 2023.12.18 |
핸들러란, 상태코드,예외처리 (1) | 2023.12.15 |
Node.js-Express(Delete,put), HTTP상태코드 (0) | 2023.12.15 |