우선 react-redux-firebase의 기본 사용용례는 아래와 같이 실시간 연결성을 기본으로 한다
import { useFirestoreConnect } from "react-redux-firebase";
나의 경우, 문서에 조회수를 추가할 예정이었는데 사람들이 문서 하나를 클릭할 때마다 모든 사람들이 해당 업데이트를 받게된다.
즉 데이터 수정 시, 해당 데이터를 연결받는 모든 실시간 사용자 수만큼 read가 발생 -> 폭발적인 횟수 차감이 발생한다는 문제가 있다
조회수는 손쉽게 늘어나는 데이터인데, 이 때문에 read가 무자비하게 발생한다면...(콰광)
따라서 firestore 를 연결해두는 것이 아닌 1회 조회 후 연결을 끊는 동작이 필요하였고 삽질 끝에 방법을 알아냈다
핵심은 redux-firebase 라이브러리에 있다
https://github.com/prescottprue/redux-firestore
이 라이브러리는 firebase와 redux를 연결시키기 위해 reducer와 action을 자동으로 생성한다.
이는 firestore를 확장, 발전시킨 instance를 만들고 이 store에 추가된 함수
react-redux-firebase 라이브러리에서는 해당 store 인스턴스를 아래 코드를 통해 불러 사용할 수 있다
import { useFirestore } from "react-redux-firebase";
const Home = () => {
const store = useFirestore();
useEffect(() => {
store.get({
collection: "schedules",
where: [
["datetime", ">=", start],
["datetime", "<", end],
],
});
}, []);
const shedules = useSelector((state) => state.firestore.data.schedules);
const orderedShedules = useSelector((state) => state.firestore.ordered.schedules);
return (<>{Object.keys(schedules)}</>)
}
get이 redux의 값을 변경하면 -> selector가 바로 감지해 리랜더링 -> get 재호출 의 무한 rerendering 이 발생한다...
이를 방지하기 위해 useEffect를 사용했다