오늘 한 일
- 노마드코더 트위터 클론코딩 실습
- 유저 권한 설정
- 프로필 등록, 수정
- 리액트 리렌더링 리팩터링
프로필
- where을 이용하여 필터링을 할 수 있다.
- where은 원하는만큼 여러 번 사용할 수 있다.
- 두번째 인자로 받는
opStr
옵션이 가장 강력하다.
const hweets = await dbService
.collection("hweets")
.where("createId", "==", userObj.uid);
- 이제 필터링한 데이터를 가져와서 정렬 후 보여주기만 하면 될 것 같지만…
const hweets = await dbService
.collection("hweets")
.where("createId", "==", userObj.uid)
.orderBy("createAt")
.get();
console.log(hweets.docs.map((doc) => doc.data));
- 콘솔을 확인해보면 오류 메세지가 출력된다.
Uncaught (in promise) FirebaseError: The query requires an index. You can create it here:
// 인덱스가 없다고..?
firestore는 noSQL 기반 DB이기 때문에 이렇게 작동할 수 없다.
- pre-made query를 사용해야 한다.
- 오름차순, 내림차순을 바꾸면 인덱싱을 다시 해야 하기 때문에 인덱스가 필요하다.
- 에러 메세지의 링크를 타고 들어가면 인덱스를 생성할 수 있다.
유저 설정 변경
- firebase에는 User에 관련된 옵션이 많이 없다. (이름, 프로필 사진 끝)
- 만약 User에 더 많은 옵션을 부여하고 싶다면 firestore의 콜렉션에 user 관련 정보를 추가하는 방법을 이용한다.
const onSubmit = async (event) => {
event.preventDefault();
if (newDisplayName !== userObj.displayName) {
await userObj.updateProfile({
displayName: newDisplayName,
});
}
};
간단하게 변경할 수 있지만, 변경한 이름이 실시간으로 반영되지 않는다.
유저 설정 버그 수정
- DB 데이터가 변경되면 리렌더링 하도록 수정한다.
/App.js
-
refreshUser 생성
const refreshUser = () => { setUserObj(authService.currentUser); };
-
App → AppRouter → Profile으로 props 데이터 전달
<AppRouter refreshUser={refreshUser} isLoggedIn={isLoggedIn} userObj={userObj} /> <Profile userObj={userObj} refreshUser={refreshUser} />
-
user의 모든 설정을 변경할 필요 없다.
- firebase의 User에는 정말 많은 정보가 담겨 있다. 많은 정보가 담길수록
- 어떤 부분만 변경되었는지 React가 확인하기 어렵고,
- 많은 정보를 불러올수록 느려진다.
- 필요한 정보만 변경하도록 한다.
const refreshUser = () => {
const user = authService.currentUser;
setUserObj({
displayName: user.displayName,
uid: user.uid,
updateProfile: (args) => user.updateProfile(args),
});
};