학습내용
미니프로젝트
1. 방명록 삭제 기능 추가
2. 읽음 확인 데이터 관리 방법 변경
mongoDB 내에는 데이터가 생성될 때마다 ObjectID라는 고유ID가 자동으로 부여된다. 처음에는 파이썬에서 {'_id':False}
를 제거해서 id를 얻어내려 했지만 그게 문제의 핵심이 아니었다. print(list(db.bsy.find()))
를 실행했을 때는 ID값이 잘 출력되었지만 콘솔창에서는 오류가 발생했다. 즉, 데이터가 제대로 전달되지 않았다는 뜻이다. 이 부분은 내 능력밖이라 튜터님께 조언을 구했었는데 _id
만 데이터 형식이 달랐던 게 문제였던 것으로 추정된다.
문자열과 숫자열로만 구성된 다른 데이터들과 달리 _id
만 고유값을 ObjectId
로 감싸고 있다. 이 ObjectId
를 제거해서 저 안에 담겨 있는 고유값을 가져올 수만 있다면 이 방법을 쓰는 게 베스트다. 데이터 정보가 중복될 가능성이 없기 때문이다. 그러나 결국 해답을 찾지 못했다. 하루종일 매달려서 찾다보면 언젠간 찾을 수 있겠지만 프로젝트 기한이 얼마 남지 않아서 일단은 보류하기로 했다. 이 부분은 시간적 여유가 있을 때 꼭 다시 찾아볼 예정이다.
1. Date.now()
를 사용해 방명록 등록시 임의로 id값을 생성
Date.now()
1970년 1월 1일 0시 0분 0초부터 현재까지의 시간을 밀리초(millisecond) 단위의 정수로 반환
function save_guestbook() {
let name = $('#name').val()
let guestComment = $('#guestComment').val()
let dateId= Date.now()
...
$.ajax({
type: "POST",
url: "/yun/guestbook",
data: {'name_give': name, 'guestComment_give': guestComment, 'date_give': date, 'dateId_give': dateId},
success: function (response) {
console.log(date)
window.location.reload()
}
});
}
2. 1에서 받아온 값과 num
을 더해서 자체id 생성 후 저장
@app.route("/yun/guestbook", methods=["POST"])
def introduction_post():
name_receive = request.form["name_give"]
guestComment_receive = request.form["guestComment_give"]
date_receive = request.form["date_give"]
dateId_receive = request.form["dateId_give"]
## 추가기능 - num 받아오기
guestbookList = list(db.bsy.find({}, {'_id': False}))
count = len(guestbookList) + 1
doc = {
'name': name_receive,
'comment': guestComment_receive,
'date': date_receive,
'num': count,
'read': 0,
'selfId': dateId_receive + str(count)
}
db.bsy.insert_one(doc)
return jsonify({'msg':'😘'})
Date.now()
만 사용하면 동시에 등록될 경우 중복으로 인식할 수 있으므로 num
을 더해서 변별력을 향상시킴
3. 방명록 삭제 기능 서버-클라이언트 연결
@app.route("/yun/guestbook/remove", methods=["POST"])
def introduction_remove():
selfId_receive = request.form["selfId_give"]
db.bsy.delete_one({'selfId': selfId_receive})
return jsonify({'msg': '삭제완료'})
function remove_guestbook(selfId) {
$.ajax({
type: "POST",
url: "/yun/guestbook/remove",
data: {'selfId_give': selfId},
success: function (response) {
confirm("정말 삭제하시겠습니까?")
alert(response["msg"])
window.location.reload()
}
});
}
삭제시 더블체크를 위해 confrim()
추가
원래는 이것도 Date.now()
가 아니라 기존에 있던 date
에 num
만 추가할 예정이었는데 오탈자가 없는데도 자꾸만 SyntaxError: missing ) after argument list in JavaScript
에러가 뜨는 바람에 지금의 형식이 되었다. 이 방식이 id값도 훨씬 깔끔해서 결과적으로 만족한다.
num
으로 관리하던 데이터를selfId
로 변경
안그래도 이 부분은 어떻게 관리를 해야하나 고민하던 참이었는데 방명록 삭제 기능을 구현하면서 자동으로 해결되었다. 중복 가능성이 0%라고 보장은 못하지만 num
으로만 관리하는 것보다는 현저하게 줄어들테니 이 정도면 만족한다.
https://stackoverflow.com/questions/32949898/deleting-document-in-pymongo-from-id
파이몽고에서 ObjectId관련해 같은 고민을 했었는데요! 위 링크 참고하시면 사용 가능할 것 같아요!