Ewhamarket 프로젝트를 진행하며 item register 화면과 item list 화면을 구현하기 위해 Firebase에서 상품 데이터를 가져오던 중, 화면에 데이터가 올바르게 출력되지 않는 문제가 발생했다.
database에는 item이 정상적으로 입력된 것을 확인할 수 있었지만,
상품 리스트(browse 화면)에는 데이터가 출력되지 않았다.
?😮??
터미널 로그를 보니 Processed Products List가 빈 리스트 ([ ]) 상태라는 것을 확인할 수 있었다.
즉, 데이터가 제대로 처리되지 않아 템플릿에 전달되지 않고 있었다.
터미널 로그를 보면 데이터 리스트 안에 None 값이 포함되어 있는 것을 알 수 있다.
all_products 리스트에 None이 포함되어 있어, 데이터 변환 과정에서 문제가 발생하여 상품 리스트 화면에 계속 등록된 상품이 없다고 뜬 것이다.
test 데이터를 입력할 때, 일부 필드를(ex. 직거래 지역, 재고 수량) 비워 놓은 채로 데이터베이스에 값을 저장하였다.
하지만 입력이 비어 있는 필드에 대해 기본값을 설정하지 않아서 그 필드의 값들이 None으로 저장된 것으로 보인다.
None 값이 리스트에 포함되어 데이터를 올바르게 변환하는 데 방해가 되고 있어, None 값인 항목들을 필터링하는 코드를 추가하였다 :
# Firebase에서 모든 데이터 가져오기
all_products = DB.get_items()
logging.debug(f"DEBUG: All Products from Firebase: {all_products}") # 디버깅 로그
# 유효한 데이터만 필터링 (None 또는 비어 있는 값을 제외)
valid_products = [item for item in all_products if item is not None]
추가적으로, valid_products의 데이터 구조가 dict일 경우와 list인 경우 모두 데이터를 일관되게 변환할 수 있도록 데이터의 타입을 확인하고 이에 맞게 변환 작업을 수행하는 추가 조건문을 적용했다.
# 데이터가 "items" 키 아래에 있는지 확인하고 변환
if isinstance(valid_products, dict):
# Firebase에서 받아온 데이터를 id 포함한 리스트로 변환
products = [{"id": str(key), **value} for key, value in valid_products.items()]
elif isinstance(valid_products, list):
# 리스트인 경우 id 포함한 각 제품의 사전으로 변환
products = [{"id": str(idx), **value} for idx, value in enumerate(valid_products) if isinstance(value, dict)]
else:
products = [] # 데이터가 없을 경우 빈 리스트
데이터베이스에서 받아오는 모든 데이터가 항상 유효한 것은 아니며, 예상치 못하게 None 값이 포함될 수도 있다는 점을 알게 되었다.
따라서 데이터를 처리하거나 변환하기 전에는 항상 데이터가 올바른지 확인해야한다.