오늘 오전엔 어제 다 못한 스파르타피디아 삭제 알고리즘 수정을 진행했다.
방법을 생각해두고 자서 그런지 생각보다 해결책 구현이 빨리 되었다.
그래서 오늘의 TIL은 이번 문제를 해결하는 '문시해알'에 대해 적겠다.

해당 웹 사이트에서 각각의 카드에 해당 카드만 삭제하는 기능을 가진 버튼을 구현하는 test가 있었다.
웹개발 종합반에 배운 내용을 써먹어
num 을 키로 가진 value 숫자를 부여후 다른 정보들과 딕셔너리에 db에 저장db.test1.delete_one({'num': int(num_receive)})방식으로 구현했었다. num 부여 방식은 아래 코드로 python에 구현했다.
test1_list = list(db.test1.find({}, {'_id': False})) # db에 있는걸 다 불러와 리스트를 만든다.
count = len(test1_list) + 1 # 해당 리스트의 길이에 1을 더해 num을 만든다.
하지만 이 방식을 활용하니 새 num을 부여할 때 카드의 갯수 + 1로 저장되어 카드의 삭제와 생성을 반복하면 num이 겹치는 문제가 발생했다.

이 상태에서 디지몬 카드를 삭제하면 num이 겹치는 푸른하늘 카드가 같이 삭제되는 오류가 발생한다.
num을 부여하는 방식이 잘못되었다고 생각해서 방법을 고민해보았다.
db에 저장될 때 리스트 안의 딕셔너리 형태로 저장되어있어 변수 생성시 구분에 유의해야한다.
딕셔너리 리스트의 컬럼을 추출하여 리스트를 새로 만드는 방법을 검색해
db에서 불러온 리스트(딕셔너리로 저장되어 있는)를 가지고 key값으로 num을 가진 value들을 모아 다시 리스트로 묶었다.
test = list((m['num'] for m in test1_list))
test 리스트에서 최대값을 찾는 python 함수는 max()
하지만 count = max(test) + 1로 바로 저장 시 카드가 하나도 없으면 max(test)값이 비어
ValueError: max() arg is an empty sequence 오류가 떴다.
그래서 test의 길이가 0일때 count를 1로 고정하는 조건문을 추가로 달았다.
test1_list = list(db.test1.find({}, {'_id': False}))
test = list((m['num'] for m in test1_list))
if len(test) == 0:
count = 1
else: count = max(test) + 1
이렇게 하니 중복없고 간단하게 카드에 num을 부여할 수 있었다.
문제가 발생하면 일단 어디서 논리적으로 오류가 발생하는지부터 생각해야 한다.
해결방법은 몇가지가 되는데 기존 오류가 해결되고 추가적인 오류가 발생하지 않으면서 효율적인 코드를 찾는게 최우선이다.
파이썬은 익숙하지 않았는데 구글링은 신이다. 검색하면 다 나온다.