4일차 TIL : 미니프로젝트 완성

변시윤·2022년 11월 3일
0

내일배움캠프 4기

목록 보기
4/131
post-custom-banner

학습내용

미니프로젝트
1. 방명록 삭제 기능 추가
2. 읽음 확인 데이터 관리 방법 변경

방명록 삭제 기능 추가

mongoDB의 ObjectID 활용(실패)

mongoDB 내에는 데이터가 생성될 때마다 ObjectID라는 고유ID가 자동으로 부여된다. 처음에는 파이썬에서 {'_id':False}를 제거해서 id를 얻어내려 했지만 그게 문제의 핵심이 아니었다. print(list(db.bsy.find()))를 실행했을 때는 ID값이 잘 출력되었지만 콘솔창에서는 오류가 발생했다. 즉, 데이터가 제대로 전달되지 않았다는 뜻이다. 이 부분은 내 능력밖이라 튜터님께 조언을 구했었는데 _id만 데이터 형식이 달랐던 게 문제였던 것으로 추정된다.

문자열과 숫자열로만 구성된 다른 데이터들과 달리 _id만 고유값을 ObjectId로 감싸고 있다. 이 ObjectId를 제거해서 저 안에 담겨 있는 고유값을 가져올 수만 있다면 이 방법을 쓰는 게 베스트다. 데이터 정보가 중복될 가능성이 없기 때문이다. 그러나 결국 해답을 찾지 못했다. 하루종일 매달려서 찾다보면 언젠간 찾을 수 있겠지만 프로젝트 기한이 얼마 남지 않아서 일단은 보류하기로 했다. 이 부분은 시간적 여유가 있을 때 꼭 다시 찾아볼 예정이다.

자체ID 생성(성공)

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()가 아니라 기존에 있던 datenum만 추가할 예정이었는데 오탈자가 없는데도 자꾸만 SyntaxError: missing ) after argument list in JavaScript 에러가 뜨는 바람에 지금의 형식이 되었다. 이 방식이 id값도 훨씬 깔끔해서 결과적으로 만족한다.



읽음 확인 데이터 관리 방법 변경

num으로 관리하던 데이터를 selfId로 변경

안그래도 이 부분은 어떻게 관리를 해야하나 고민하던 참이었는데 방명록 삭제 기능을 구현하면서 자동으로 해결되었다. 중복 가능성이 0%라고 보장은 못하지만 num으로만 관리하는 것보다는 현저하게 줄어들테니 이 정도면 만족한다.

profile
개그우먼(개발을 그은성으로 하는 우먼)
post-custom-banner

2개의 댓글

comment-user-thumbnail
2022년 11월 3일

https://stackoverflow.com/questions/32949898/deleting-document-in-pymongo-from-id
파이몽고에서 ObjectId관련해 같은 고민을 했었는데요! 위 링크 참고하시면 사용 가능할 것 같아요!

1개의 답글