comment 따로 따로 만들기
db 하나로 합치기
이름 추가
조건에 따라 이름 익명으로 만들기
comment 따로 따로 만들기
원래는 팀 소개 페이지에 댓글 페이지를 하나만 만들었다. 팀원 소개 페이지를 처음에 열면 댓글 페이지를 숨겨 주고, 팀원 카드가 나올 때마다 댓글 페이지가 나오게끔까지만 해놓았다.
그런데 팀원TIL을 보다가 각자 따로 댓글을 달 수 있게 하면 좋을 거 같다는 의견을 보고 당장 만들어야겠다는 생각이 들었다..! 일단은 손이 많이 가는 형태로 DB를 DB_A, DB_B, DB_C, ... 이런 식으로 각자 만들어 준 뒤, 그 DB에 코멘트를 넣어서 저장해서 불러오는 형태로 구현했다.
그런데 조금 더 생각을 해보니 DB에 굳이 나눠담을 필요가 있을까? 생각했다. 한 DB에 key값만 다르게 설정해서 넣어주고, key값에 따라 불러와서 나열해주는 방법은 없을까 생각해 보기 시작했다.
원래
DB_A = [ { _id : ~~~, Acomment : ~~~ }, { _id : ~~~, Acomment : ~~~}, { _id : ~~~, Acomment : ~~~} ]
DB_B = [ { _id : ~~~, Bcomment : ~~~ }, { _id : ~~~, Bcomment : ~~~}, { _id : ~~~, Bcomment : ~~~} ]
이런 식에서
DB = [ { _id : ~~~, Acomment : ~~~ }, { _id : ~~~, Bcomment : ~~~}, { _id : ~~~, Dcomment : ~~~} ]
의 형태로 만들어서 데이터를 뽑고 싶었다. mongoDB는 NoSQL이니까 가능할거라고 생각했다..!
db 하나로 합치기
<< 1번째 시도 >>
- DB를 하나로 합친다.
- DB에 있는 자료를 id를 빼고 다 불러온 후 (웹개발 종합반에서 썼던 코드 그대로 쓰려고 했기 때문) 그 리스트를 rows라고 한다.
- rows를 forEach문으로 돌린다.
rows.forEach((a) => {
let Acomment = a['Acomment']
let temp_html = '~~'
$('#comment-list').append(temp_html)
}
==> 문제가 생겼다.
내 예상으로는 key값이 Acomment인 거만 들어오니까 문제가 없다고 생각했는데 밑에 append 메소드가 있어서 key값이 Acomment이지 않아도 undefined로 .append(temp_html)에 붙어버렸다.
지금 생각을 해보니까 만약 comment를 확인했을 때, null값이거나 빈 값이면 continue;를 사용하면 됐을 거 같네..? 쨌든 그 때는 append 메소드 때문이라고 생각을 안하고 Acomment 정의내려준 부분이 잘못이라고 생각했다..(지옥 시작..)
<< 2번째 시도 >>
그렇다면 애초에 python 파일쪽의 GET쪽에서 key값이 Acomment인거만 불러오자!라고 생각을 하게 되었다.
그런데 db에서 불러오는 쿼리를 몰라서 한참 헤매다가 결국 튜터님 찬스..! 천사같은 튜터님.. 엄청 검색하시고 심지어 mongoDB를 직접 해보시면서 찾아서 가르쳐주셨다. 정말정말 너무 감사했다. 그리고 구글링도 실력이구나 싶었다. 나는 아무리 찾아보고 해도 잘 모르겠던데.
그래서 결국! 이 DB는 데이터가 서로 아예 겹치지 않고 다른 데이터이기 때문에 DB에서 이 key값이 존재할 때 list를 불러와줘! 하는 코드를 썼다.
all_jscomments = list(db.comment.find({"jscomment": {"$exists": True}}))
==> 이번에 생긴 문제는?
return jsonify( { 'result' : all_jscomments } )
여기서 문제가 생겼다.왜? 원래 기존에는 _id값을 false로 줌으로써, 데이터를 json시켜서 dictionary형태로 웹에 내릴 수 있었는데, 저 조건을 넣으니까 _id가 있어서 json을 시킬 수가 없었다. 튜터님이 찾아보시니 mongoDB의 _id가 포함되면 json시키지 못한다고 한다. 그래서 이 _id의 값을 json시켜야 하는데 그럴려면 bson이라는 걸 이용하여 _id > bson > json 이런식으로 해야 되는 거 같았다.
<< 3번째 시도 >>
from bson.json_util import dumps
// import
result = dumps(all_jscomments) // bson
return jsonify({'result':result})
와!! 이제 json은 되었다..!!! GET도 잘 되었다고 나왔다!!
근데.. 정작 중요한 댓글이 올라가지가 않는다. 무엇이 문제인고 하고 console.log(result)를 찍어서 보니 웹에 도착도 잘 한거 같다. 그런데 다음에 뜬 오류를 보고 무엇이 문제인지 알게 되었다.
forEach문에서 오류가 났다! 왜? 우리가 가져온 자료의 형태는 dictionary형태라 array형태로 바꿔야 forEach문으로 돌릴 수 있었다. 정확히 말하면 dictionary는 dictionary의 key값 형태로 돌릴 수 있기는 하다. 아마 forEach문 이전에 key값으로 뭔가 정의를 해두고 돌리면 돌릴 수 있지 않았을까? 라는 의문이 지금 들기는 한다.(공부 필요!)
<< 4번째 시도 >>
어쨌든 우리는 그 방법을 택하지 않고 dictionary를 array형태로 바꿔주는 코드를 하나 더 썼다.
fetch('/jmintro').then((res) => res.json()).then((data) => {
let rows = JSON.parse(data['result']);
...
...
...
}
그랬더니 array인지 판별하는 함수를 썼을 때 ok라고 나왔고, 두구두구두구두구 드디어 forEach문이 돌아가서 댓글도 잘 달렸다!!! 이렇게 써 놓고 보니까 짧아 보이지만 절대 짧지 않았다.. ㅠㅠㅠㅠ 튜터님 너무 고생하셨습니다..
이름 추가
개인별 comment를 달고 나니까 이번에는 그 comment를 다는 사람의 이름을 달아주는 작업을 하고 싶었다. 이름을 다는 작업은 DB를 합치는 작업보다 훨씬 쉬웠다. name이라는 변수만 곳곳에 잘 추가해주면 되었다.
여기서 약간 욕심이 났다..! 만약에 Name에 아무 것도 적지 않으면 익명이라고 표시하게 하는 것은 어떨까?! 하는 욕심!
조건에 따라 이름 익명으로 만들기
if(jmname==''){
jmname = '익명';
}
이것도 생각보다 쉬웠다..! name에 아무 값도 들어오지 않으면 '익명'을 출력해줘. 라는 if문을 아까의 forEach문에 넣으면 되는 것이었다.
영상 제출은 내일 11시까지이지만 팀원분들의 엄청난 참여율로 생각보다 조금 일찍 그리고 뿌듯하게 프로젝트를 끝냈고, 영상 녹화와 편집도 팀원분들이 열심히 해주셔서 일찍 제출을 하고 오늘의 캠프가 끝이 났다.
캠프를 시작한 첫 주. 첫 날부터 팀원들이 의견을 많이, 자유롭게 내는 것을 보고 아 우리 팀 너무 좋다. 싶었는데 갈수록 더 좋다.. 이럴 수 있나? 팀원들이 열심히 할 수록 나도 폐 끼칠 수 없다 싶어 더 열심히 한 것 같다. 프로젝트마다 팀원들이 바뀐다는데 너무 아쉽다. 하지만 우리 팀원들의 좋은 분위기를 배워서 나도 다음 팀을 이뤘을 때 더 좋은 분위기를 내게 될 수 있을 것 같다. 다음 팀원들이 나를 보며 지금 내가 우리 팀원을 보는 느낌을 받았으면 좋겠다. 매일매일이 팀원들한테 감사한 하루였다. 우리 팀 멋있다!! 우리 팀원들 하고 싶은거 다 해..!!!
'SPARTA Project' 카테고리의 다른 글
[Java] 개인 프로젝트 - 키오스크 구현 정리(5/26 ~ 6/2) (0) | 2023.06.02 |
---|---|
< 초록색이 젤다 맞죠? > - KPT 회고 (0) | 2023.05.19 |
< 초록색이 젤다 맞죠? > - 팀 프로젝트 03 (0) | 2023.05.17 |
< 초록색이 젤다 맞죠? > - 팀 프로젝트 02 (0) | 2023.05.16 |
< 초록색이 젤다 맞죠? > - 팀 프로젝트 01 (0) | 2023.05.15 |