Project Tours/Tour on Plantopia

[리팩토링] 왜 식물 리스트 최신화가 안 이루어지는가?

Kestrel 2023. 9. 15. 14:01

분명 삭제, 생성 로직은 문제가 없었는데 생성하고 navigate로 메인 리스트로 돌아오는데 생성 때는 문제 없이 리스트가 업데이트 되어 출력되지만 삭제 시에는 데이터는 삭제 되었는데 클라이언트 단에서 업데이트가 안되어있었다. 도대체 왜 그런지 이해를 못하고 있으면서 로직이 잘못 되었나 살피었다. 

 

분명 이 접근이 잘못된 것이 클라이언트 단에서 화면 업데이트 문제인데 데이터 코드를 보았다는 것은 멍청했다.

 

export const deletePlantDataByDocId = async (docId: string) => {
  if (!docId) return;
  // 삭제할 plantData를 먼저 찾고
  const docRef = doc(db, 'plant', docId);
  const plantData = await findPlantDataByDocId(docId);

  // 유저 이메일로 데이터를 받아서 사이즈를 확인해야함, 사이즈가 1이면 그냥 바로 삭제.
  const q = query(
    collection(db, 'plant'),
    where('userEmail', '==', plantData?.userEmail),
  );
  const userPlants = await getDocs(q);

  // 유저가 가지고 있는 plant가 하나인 경우 바로 삭제
  if (userPlants.size === 1) {
    await deleteDoc(docRef);
    successNoti('식물을 삭제하였습니다.');
    return;
  }

  // id로 찾은 식물 데이터가 메인이니? 삭제하고 유저 데이터의 첫 번째 식물을 메인으로 등록
  if (plantData?.isMain == true) {
    try {
      await deleteDoc(docRef);
      const firstPlantDataId = userPlants.docs[0].id;
      const documentRef = doc(db, 'plant', firstPlantDataId);
      const updatedFields = {
        isMain: true,
      };
      await updateDoc(documentRef, updatedFields);
      console.log('메인에서 삭제됨');
      successNoti('식물을 삭제하였습니다.');
      return;
    } catch {
      errorNoti('식물 삭제에 실패 하였습니다.');
      return;
    }
  }
  // 메인이 아니라면 바로 삭제
  else if (plantData?.isMain == false) {
    try {
      await deleteDoc(docRef);
      console.log('메인 아님에서 삭제됨');
      successNoti('내 식물이 삭제 되었습니다.');
      return;
    } catch (error) {
      errorNoti('식물 삭제에 실패 하였습니다.');
      return;
    }
  }
};

역시나 문제가 없다. 파이어 베이스에서도 삭제가 잘된다.

 

그럼 컴포넌트에서 문제가 있다는 것인데 

  const deletePlant = async () => {
    if (docId) {
      await deletePlantDataByDocId(docId);
    }
    navigate('/myplant');
  };

정말 바보 같게도 async를 써놓고 await을 안적어주었다... 왜 에러가 안났는지 의문....

이전에 프론트 코치가 데이터단과 프론트단을 분리해서 고민하라고 했는데 또 같은 실수를 해서 좀 마음이 안좋았다.

await을 안적다보니 데이터 삭제 기다림 없이 그냥 리스트 페이지로 이동했고 당연히 화면에 삭제 데이터가 남아있었다.

이런 실수는 이제 그만할 때가 된 것 같다.