230209 TIL #4 넘버링/삭제 구현

김춘복·2023년 2월 9일
0

TIL : Today I Learned

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

230209 Today I Learned

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


카드에 각각 넘버링 후 삭제 구현

문제점

해당 웹 사이트에서 각각의 카드에 해당 카드만 삭제하는 기능을 가진 버튼을 구현하는 test가 있었다.
웹개발 종합반에 배운 내용을 써먹어

  1. 영화 기록하기 누를 시 각 카드에 num 을 키로 가진 value 숫자를 부여후 다른 정보들과 딕셔너리에 db에 저장
  2. html get 요청시 카드 업데이트 될 때 삭제버튼에 해당 num이 부여된 삭제함수 삽입
  3. 삭제버튼 클릭 시 post요청으로 서버에 num을 주고 해당 num을 value로 가진 딕셔너리를 삭제
    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을 부여하는 방식이 잘못되었다고 생각해서 방법을 고민해보았다.

  1. 중복되지않은 숫자에 num을 자동으로 배정하기
    이 방법이 best라고 생각했지만 파이썬이 아직 미숙하고
    간단한 작업에 지나치게 코드가 복잡해질 것 같아 포기
  1. num값이 가장 큰 카드를 찾고 그 값에서 +1을 해 num을 부여하기
    이 방식을 사용할 시 카드를 삭제하면 해당 num이 비어버리고 skip되면서
    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을 부여할 수 있었다.

알게된 점

  • 문제가 발생하면 일단 어디서 논리적으로 오류가 발생하는지부터 생각해야 한다.

  • 해결방법은 몇가지가 되는데 기존 오류가 해결되고 추가적인 오류가 발생하지 않으면서 효율적인 코드를 찾는게 최우선이다.

  • 파이썬은 익숙하지 않았는데 구글링은 신이다. 검색하면 다 나온다.

기타

  • 같은 문제에서 다른 해결책
    마지막으로 저장된 카드의 num에 +1해서 새로 넘버링하는 방법.
    이 방법은 코드 한줄 추가로 해결되서 훨씬 깔끔하다.
    역시 방법은 많다. 좀 더 고민해보자!!
profile
Backend Dev / Data Engineer
post-custom-banner

0개의 댓글