Po_tta_tt0
콩심콩 팥심팥 🌱
Po_tta_tt0
전체 방문자
오늘
어제
  • 분류 전체보기 (266)
    • 🐛 회고 (14)
    • 💭 생각 (2)
    • 🤸‍♀️ 내 프로젝트 (16)
      • FISH-NEWS (8)
      • MBTI 과몰입 테스트 (2)
      • twitter clonecoding with TS (4)
      • pilzagenda (2)
    • 👨‍👩‍👧‍👦 팀 프로젝트 (2)
      • 피우다 프로젝트 (0)
      • SEMO(세상의 모든 모임) (1)
      • 마음을 전하는 텃밭 (1)
      • Stackticon (0)
    • 👨‍💻 CS지식 (11)
    • ✍ 공부 (94)
      • JavaScript (21)
      • TypeScript (39)
      • Html (0)
      • CSS (2)
      • React (18)
      • NextJS (7)
      • Vue (1)
      • Python (1)
      • Django (0)
      • 개발환경 & 그 외 (2)
    • 🏄‍♀️ 코딩테스트 (99)
      • 🐍 Python (99)
    • 🐙 Git & GitHub (3)
    • 📑 오류기록 (8)
    • 📚 우리를 위한 기록 (9)
    • 수업 (3)
    • 강의 등 (2)
    • 👩‍🎓 SSAFY (0)
    • 👋 우테코 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 구현
  • 파이썬
  • BFS + DP
  • DP
  • 자바스크립트
  • Next.js
  • 문자열
  • React
  • js
  • 이분탐색
  • dfs
  • 파이썬 감시 피하기
  • 백준 파이썬
  • 플로이드 워셜
  • 백준 숨바꼭질
  • 파이썬 다익스트라
  • 시뮬레이션
  • react-router-dom
  • bfs
  • 백준

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Po_tta_tt0

콩심콩 팥심팥 🌱

[ Nomad coders ] (의식의 흐름으로 쓰는) twitter clone 타입스크립트로 다시 만들어보기 3
🤸‍♀️ 내 프로젝트/twitter clonecoding with TS

[ Nomad coders ] (의식의 흐름으로 쓰는) twitter clone 타입스크립트로 다시 만들어보기 3

2022. 2. 11. 20:05
반응형

 

#3.0 ~ #3.3

 

 

이번에도 진도는 볼품없다

진도를 팍팍 빼서 쓰고 싶은데 다른것들과 병행하느라 너무 바빠..

 

 

 

ts는 어느정도 익숙하게 다루고 있다

아직 모르겠다 싶으면 쓰는 any의 남발이 문제기는 하지만 그건 ts를 더 배우며 나아질것

현재 내가 할 수 있는 최선을 다해 주어진 과제를 해결하는게 목표.

 

 

 

💻

 

 

 

이용한 라이브러리

react-hook-form

 

저번주까지는 그냥 한번 타입만 넣은 클론코딩을 하려고 생각했던 것 같은데

react hook form 정도는 괜찮지 않을까..? 하고 이용했다.

react hook form에 대해서는 블로그로 다시 포스팅 할 예정

그리고 여러 자식 컴포넌트를 타고 내려오는 props가 등장하면서 recoil도 몹시 사용하고 싶지만 이건 꾹 참는중

 

 

 

 

firestore을 활용하는 과정에서 궁금증이 생겼다.

 

fireStore에서 addDoc과 setDoc의 차이점이 무엇인가?

 

 

setDoc

import { doc, setDoc } from "firebase/firestore";

// Add a new document in collection "cities"
await setDoc(doc(db, "cities", "LA"), {
  name: "Los Angeles",
  state: "CA",
  country: "USA"
});

문서에 유의미한 id를 둔다. 'new-city-id' 

 

 

addDoc

import { collection, addDoc } from "firebase/firestore";

// Add a new document with a generated id.
const docRef = await addDoc(collection(db, "cities"), {
  name: "Tokyo",
  country: "Japan"
});
console.log("Document written with ID: ", docRef.id);

문서에 유의미한 id를 두지 않는다. => 랜덤한 id가 자동 생성된다

 

실제로 .add(...)와 .doc().set(...)은 완전히 동일하므로 더 편리한 것을 사용하면 됩니다.

공식문서 내용.

 

만약에 문서에 유의미한 id를 두고 싶으면 setDoc를 이용하고

문서에 유의미한 id가 필요없다면 addDoc를 이용하면 될 것 같다.

 

 

 

 

문서 가져오기

 

공식문서 : 문서 가져오기

import { doc, getDoc } from "firebase/firestore";

const docRef = doc(db, "cities", "SF");
const docSnap = await getDoc(docRef);

if (docSnap.exists()) {
  console.log("Document data:", docSnap.data());
} else {
  // doc.data() will be undefined in this case
  console.log("No such document!");
}

공식문서에서 나온 단일 문서 내용 검색 방법이다.

 

이 공식 문서를 보고

    const docSnap = await getDoc(collection(db, "tweets"));

    if (docSnap.exists()) {
      console.log("Document data:", docSnap.data());
    } else {
      console.log("No such document!");
    }

이렇게 문서 내용을 가져오려고 했으나

여러 문서를 가져와야 하는 상황에 '단일 문서'를 가져오려 해서 실패했다.

 

오류 내용

Uncaught (in promise) FirebaseError: Expected type 'Pa', but it was: a custom Va object

 

=> getDoc가 아닌 getDocs를 사용해야 한다

 

 

공식 문서 : 컬렉션에서 여러 문서 가져오기

import { collection, query, where, getDocs } from "firebase/firestore";

const q = query(collection(db, "cities"), where("capital", "==", true));

const querySnapshot = await getDocs(q);
querySnapshot.forEach((doc) => {
  // doc.data() is never undefined for query doc snapshots
  console.log(doc.id, " => ", doc.data());
});

 

내 코드

 const querySnapshot = await getDocs(query(collection(db, "tweets")));
    querySnapshot.forEach((doc) => {
      const tweetObj = {
        text: doc.data().tweet,
        createdAt: doc.data().createdAt,
        id: doc.id,
        userId: doc.data().creatorId,
      };
      setTweets((prev) => [tweetObj, ...prev]);
    });

잘 작동한다🏃‍♀️

 

 

 

 

 

 

 

 

 

🤔

그러나 컴포넌트가 렌더링 될 때만 문서를 가져오는 것은 좋지 못하다.

내가 올린 글을 바로바로 보고 싶다.

이럴 때를 대비해서 실시간 업데이트를 위한 문서가 존재한다.

=> 공식 문서 : 실시간 업데이트 수신 대기

 

 

onSnapshot() 메서드를 이용해서 문서를 수신 대기 상태에 둔 후,

사용자의 호출에 따라 단일 문서의 현재 콘텐츠로 문서 스냅샷이 즉시 형성된다.

그 후 콘텐츠가 변경될 때마다 콜백이 호출되어 문서 스냅샷을 업데이트한다

=> 유저가 올리고 삭제하고 교체하는 등의 활동을 할 때 문서가 자동으로 가져와진다는 말.

 

 

 

 

공식 문서 : 컬렉션에서 여러 문서 수신 대기

 

import { collection, query, where, onSnapshot } from "firebase/firestore";

const q = query(collection(db, "cities"));
const unsubscribe = onSnapshot(q, (querySnapshot) => {
  const cities = [];
  querySnapshot.forEach((doc) => {
      cities.push(doc.data().name);
  });
  console.log("Current cities in CA: ", cities.join(", "));
});

이 스냅샷 핸들러는 문서의 추가, 삭제, 수정 등 쿼리 결과의 변경에 따라 새 쿼리 스냅샷을 수신한다.

 

내 코드

 useEffect(() => {
    const q = query(collection(db, "tweets"));
    onSnapshot(q, (querySnapshot) => {
      const tweetArray: any = querySnapshot.docs.map((doc) => ({
        text: doc.data().tweet,
        createdAt: doc.data().createdAt,
        id: doc.id,
        userId: doc.data().creatorId,
      }));
      setTweets(tweetArray);
    });
  }, []);

useEffect로 처음 시작할 때 실행시킨 다음에

onSnapshot을 이용해서

tweetArray를 만들고(typescript를 쓰지 않으면 : any는 지우셔도 됩니다).

map을 이용하여 setTweets라는 useState 안에 차곡차곡 넣어준다

 

 

 

이외에도 스냅샷 간의 변경사항 보기, 로컬 변경사항 보기, 

데이터를 수신 대기할 필요가 없을 때 리스너 분리하기 등등..

공식 문서를 보면 정말 많은 정보를 얻을 수 있다.

 

 

.

.

.

나는 평소에 언어 세팅을 영어로 해놓기 때문에 공식문서를 읽을 때 설렁설렁 읽는 경우가 많다

언어를 한글로 해놓고 보니 이렇게 읽기 편했구나...

번역 과정에서 생길 수 있는 작은 오류들을 피하기 위해 영어로 읽고 있었는데 더 많은 오류를 범하고 있었던 것 같기도 하다..

 

영어를 열심히 공부하든지 일단 한국어로 설정하든지 해야 할 것 같다.

일단은 영어 공부를 더 해보는 것으로!

 

 

 

 

 

 

반응형

'🤸‍♀️ 내 프로젝트 > twitter clonecoding with TS' 카테고리의 다른 글

[ Nomad coders ] (의식의 흐름으로 쓰는) twitter clone 타입스크립트로 다시 만들어보기 4  (0) 2022.02.25
[ Nomad coders ] (의식의 흐름으로 쓰는) twitter clone 타입스크립트로 다시 만들어보기 2  (0) 2022.02.04
[ Nomad coders ] (의식의 흐름으로 쓰는) twitter clone 타입스크립트로 다시 만들어보기  (0) 2022.01.28
    '🤸‍♀️ 내 프로젝트/twitter clonecoding with TS' 카테고리의 다른 글
    • [ Nomad coders ] (의식의 흐름으로 쓰는) twitter clone 타입스크립트로 다시 만들어보기 4
    • [ Nomad coders ] (의식의 흐름으로 쓰는) twitter clone 타입스크립트로 다시 만들어보기 2
    • [ Nomad coders ] (의식의 흐름으로 쓰는) twitter clone 타입스크립트로 다시 만들어보기
    Po_tta_tt0
    Po_tta_tt0
    감자의 코딩하는 블로그 콩심은데 콩나고 팥심은데 팥난다

    티스토리툴바