웹개발 종합반 5주차 초반 과제에 버킷리스트 제작이 있었다.
원래의 내용은 목록을 입력하고 버튼을 누르면 DB에 들어가고, 완료버튼을 누르면 취소선이 가면서 삭제되는 정도.
하지만 난 욕심쟁이. 게임에는 기능이 많을수록 좋지. (너무 많으면 또 별로지만🤔)
이왕 만드는거 완료했던 것을 미완료 상태로 되돌리는 기능과, 아예 버킷리스트에서 삭제하는 기능도 만들어보고 싶었다.
물론 알고리즘을 아냐? 하시면 아니요, 저는 말하는 감자입니다만.🤔 잘 삶아서 샐러드에 넣어주십시오. 솔라닌은 싫습니다(???)
▶되돌리기(취소)는 구현해서 버튼까지 잘 들어가있다. 남은건 삭제버튼이다.
큰 골자에서 작은 것으로 들어가보자. 구조화를 해보자...
해야할 것 : app.py에 기능 만들기 - index.html에서 API랑 연결시키기
app.py에서는 GET? POST? - 삭제하는건 데이터의 변동이니 POST?
▶틀렸다. DELETE Type이 있었다!
type 관련내용 참고: https://velog.io/@khyun11/Flask-HTTP-Method-%EC%B2%98%EB%A6%AC
기능이 구현은 되는데 내가 입력한 window.location.reload()가 수행되지 않는다. 그래서 수동으로 F5 하면 삭제는 되어있다. 흠...🤔
그리고 다음과 같은 메시지가 뜬다.
TypeError: 'Collection' object is not callable. If you meant to call the 'update' method on a 'Collection' object it is failing because no such method exists
▶del_bucket에 붙이면 오류나는 함수가 들어있어서 제거했더니 잘 작동한다!
db.bucket.update_one({'num': int(num_receive)}, {'$set': {'num': int(num_receive)}}, upsert=True)
#({조건}을 찾아서, 해당 데이터가 있으면 update, 없으면 insert)
이 함수를 붙이려던 이유는 번호 중복 문제때문에, 해당 num이 있으면 num을 update하고 없으면 input시키려고 했다.
upsert 관련내용 참고: https://brownbears.tistory.com/282
skip 관련내용 참고: https://velopert.com/516
└skip은 find 관련 method라서 정렬에는 도움이 안 될것!
내가 원하는건 POST 혹은 UPDATE 시에 num을 수정하는 코드임. 🤔
DB에서 내가 삭제하거나 삭제하기 버튼으로 내가 삭제하는 경우, num을 세는 함수가 단순한 탓에 함수의 번호가 중복되는 경우가 생겼었다.
예를 들어 컵라면 먹기와 운동하기가 둘다 5번으로 주어진 경우, 컵라면 먹기의 완료를 눌렀는데 운동하기가 완료되어 취소선이 가고 컵라면 먹기의 완료는 영원히 불가능한 현상을 발견했다.
그래서 id값을 현재 날짜(년월일시에 분초까지)를 찍어주는 것으로 생성해서, num 또한 날짜대로 정렬하고 싶었다.
▶일단 id값을 날짜로 찍어주는 것은 성공했다!
import time
을 해주고, bucket_post에
'_id' : '_id': time.strftime('%Y-%m-%d-%H-%S')
으로 선언했더니 잘 입력되었다.
그래서 GET이나 POST쪽에 타입에 UPDATE를 추가하고,
num이 동일하면 num을 집어넣지 않고 다음 번호를 부여하고, 같지 않으면 insert를 하는 if문을 걸어볼까 하는데...🤔
어떤 번호를 부여할지의 기준은 id다. 날짜값을 받아왔으니 id가 더 이른 것이 더 앞 번호를 받게끔.
대강 생각하는 알고리즘은 이렇다.
if(num_receive==num) { #기존값과 새로 입력한 값의 num값이 중복될 경우!
둘의 id를 비교해서 더 이른 id면 더 이른 번호를 받게 해야지
}
else {
응? 같지 않은데? 응 그럼 그냥 insert
}
▶이러기 위해서는 _id가 yyyy-mm-dd 형식이면 안되고 'yyyymmdd' 형식이어야 한다. mongoDB는 어차피 ID값은 string으로 받기 때문에, 얘를 int로 잡아왔을때 단순비교로 숫자가 커야 if문을 돌릴 수 있기 때문!
근데 이런 메서드가 있었던가? 이건 자고 일어나서 좀더 고민을 해봐야겠다.🤔