본문 바로가기

TIL

[TIL 2024. 06. 03] Redis로 장바구니 update

우리는 elder_menu.html상의 장바구니를 Redis에서 조회해서 사용하기로 했고, 이후 cart_ai의 결과에 따라 장바구니의 내용이 바로바로 update되어 Redis에 저장하고, 이를 다시 가져와서 elder_menu.html에서 쓰기 위해 개발을 진행하고 있다

 

 cart_ai에서 필요한 update항목은 사실상 "메뉴 이름과 수량"뿐이라 Redis의 cart table을 처음에는 다음과 같은 형식으로 hashset을 이용해서 만들었다.

key-(branch명), value 중 field-(menu_name), value 중 value-(수량)

 

하지만, 이렇게 구현하고 보니 문제점이 있음을 알게 되었다..

 

기본적으로 js로 작성해놓은 현재의 장바구니에는 "메뉴 이미지, 이름, 가격, 수량" 항목이 모두 포함되어 있다는 점이다. 즉, 우리는 이 Redis table을 html상에 출력되는 장바구니 정보로도 바로 사용해야 하는데, 현재와 같은 장바구니 항목들을 유지해주려면 추가로 "메뉴 이미지, 수량"을 추가해줘야 하는 것이다.

key-(branch명), value 중 field-(menu_name) // value 중 value-(수량, 이미지, 가격)

 

cart_ai의 inputText로 들어오는 것은 메뉴 이름과 수량, action에 대한 정보 뿐이므로 어떻게 해당 inputText에 포함된 메뉴에 대한 이미지와 가격을 넣어줄까를 고민하다 filter를 사실상 2번 사용하여 DB로부터 해당 메뉴에 대한 정보를 조회해와서 이를 CartItem() 호출시의 매개변수로 같이 넣어주는 방식으로 일단 구현을 진행해보기로 했다.

 

# 장바구니 항목 수량 수정
@csrf_exempt
@api_view(['POST'])
def add_quantity(request):
    if request.method == "POST":
    # username = request.user.username # 나중에 elder_menu에서 연결할 때 다시 구현
    # print("\n\n request user >> ", request.user)
        username = request.POST.get("username") # mega
        print("\n\n add_quantity username: ", username)
        name = request.POST.get("name") # 아메리카노
        print("\n\n name은 잘 들어왔는지: ", name)
        quantity = int(request.POST.get("quantity")) # 3
        print("\n\n quantity 잘 들어왔는지: ", quantity)

    cart = Cart(username)

    menu = Menu.objects.filter(store_id = 2, food_name = name).first()
    print("\n\n menu가 이렇게 가져오는 게 맞나: ", menu, menu.food_name, menu.img, menu.price)
    image = menu.img
    price = menu.price
    item = CartItem(image, name, price, quantity)
    serializer = CartSerializer(item)
    item_data = serializer.data

 


이렇게 해서 update_quantitiy()기능이 잘 기능함을 확인했다.

그런데 저녁 이후 테스트를 진행하던 중에 filter와 first를 통해 가져오는 menu에 계속 "None"값이 프린트 되는 문제점을 확인했다.

 

이리저리 코드를 수정해보는데 아무래도 filter를 "food_name = name"으로 하는부분에서 걸려서 계속 오류가 발생하는 듯해서 filter가 아니라 get을 통해 코드를 수정하니 정상적으로 작동했다. 하지만 이해할 수 없는 것은 그러고 나서 다시 기존의 filter와 first를 사용하는 코드도 혹시 몰라 테스트해봤는데, 언제 오류가 발생했었냐는 듯 다시 잘 기능했다는 점...ㅜㅜ

 

일단 아래가 get으로 수정했던 코드이다

menu = Menu.objects.get(store_id = request.user.id).filter(food_name = name)
## 특정 store_id에 해당하는 food_name은 한개씩으로 중복되지 않으므로 get으로 조회해오는 것도 가능!