Firebase 데이터 처리

chelseey·2024년 11월 20일

Ewhamarket 프로젝트를 진행하며 item register 화면과 item list 화면을 구현하기 위해 Firebase에서 상품 데이터를 가져오던 중, 화면에 데이터가 올바르게 출력되지 않는 문제가 발생했다.

상황

database에는 item이 정상적으로 입력된 것을 확인할 수 있었지만,

상품 리스트(browse 화면)에는 데이터가 출력되지 않았다.

?😮??

문제 원인

터미널 로그를 보니 Processed Products List가 빈 리스트 ([ ]) 상태라는 것을 확인할 수 있었다.
즉, 데이터가 제대로 처리되지 않아 템플릿에 전달되지 않고 있었다.

해결 방법

Firebase 데이터에 None 값 존재

터미널 로그를 보면 데이터 리스트 안에 None 값이 포함되어 있는 것을 알 수 있다.
all_products 리스트에 None이 포함되어 있어, 데이터 변환 과정에서 문제가 발생하여 상품 리스트 화면에 계속 등록된 상품이 없다고 뜬 것이다.

None 값이 발생한 이유

test 데이터를 입력할 때, 일부 필드를(ex. 직거래 지역, 재고 수량) 비워 놓은 채로 데이터베이스에 값을 저장하였다.
하지만 입력이 비어 있는 필드에 대해 기본값을 설정하지 않아서 그 필드의 값들이 None으로 저장된 것으로 보인다.

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 = []  # 데이터가 없을 경우 빈 리스트
그 결과 DB에 저장된 item들이 정상적으로 상품 리스트에 출력되는 것을 확인할 수 있었다.

후기

데이터베이스에서 받아오는 모든 데이터가 항상 유효한 것은 아니며, 예상치 못하게 None 값이 포함될 수도 있다는 점을 알게 되었다.
따라서 데이터를 처리하거나 변환하기 전에는 항상 데이터가 올바른지 확인해야한다.

0개의 댓글