January 8, 2022 • ☕️ 4 min read
나름 시끌벅적한 새해의 시작
코로나 격리해제됐다. 내 세상이다.
firebase에 firestore 말고 RealTime database가 언제 생겼는지는 모르겠지만, 아무튼 생겼다고 한다.
RealTime database는 여러 클라이언트에서 실시간으로 상태를 동기화해야 하는 모바일 앱을 위한 효율적이고 지연 시간이 짧은 솔루션이다. 하지만 경험해보니 그렇게 유용한지는 모르겠다. 사용 방법도 솔직히 불편하다.
여기에서 서비스의 특성에 맞게 firestore와 RealTime database 중에서 추천해준다고 하는데, 뭘 하든 그냥 RealTime database를 쓰라는 것 같다 😑
더군다나 react query와 함께 사용하려니 정말 거지같았다!
그래도 여차저차 포스팅을 참고해서 realTimeApi
클래스를 만들어보았다.
export class RealTimeApi {
#firebase: FirebaseApp;
constructor() {
this.#firebase = initializeApp({
// ...
});
}
public fetch<T>(path: string): Promise<T> {
return new Promise<T>((resolve, reject) => {
const db = getDatabase();
const reference = ref(db, path);
onValue(reference, (snapshot) => {
const data = snapshot.val();
if (data) {
resolve(data);
} else {
reject(new Error("firebase get error"));
}
});
});
}
public post<T>(path: valueof<typeof API_PATH>, postBody: T): Promise<void> {
return new Promise<void>((_, reject) => {
const db = getDatabase();
const newPostKey = push(child(ref(db), path)).key;
try {
const updates: Record<string, T> = {};
updates[path + newPostKey] = { id: newPostKey, ...postBody };
return update(ref(db), updates);
} catch (error) {
reject(new Error("firebase post error: " + error));
}
});
}
}
export default new RealTimeApi();
react query hook에서 사용은 아래와 같이 하고 있다.
const fetchTalks = async () => {
try {
const data = await realTimeApi.fetch<TalkContent[]>(API_PATH.talk);
return data;
} catch (error) {
console.error(error);
}
};
const useLoadTalks = (
options?: UseQueryOptions<TalkContent[] | undefined, AxiosError>
) => {
return useQuery<TalkContent[] | undefined, AxiosError>(
"confirmedData",
fetchTalks,
options
);
};
타이핑이 아직 살짝 부족하다. 그래도 타입스크립트의 매력을 조금씩 더 알아가고 있다.
어쨌든, ‘이야기’ 탭의 글 작성과 불러오기에 성공했다. 어김없이 어거지 코딩이 조금씩 늘어나고 있긴 하지만
화면 하단 노란 에러는 흐린눈 할거다.
아직도 헤매면서 사용하고 있었다니! 정말 바보잖아.
Date.now()
와 new Date()
모두 현재 시점의 DateTime을 제공하지만, Date.now()
는 number
타입의 timestamp를 반환하고, new Date()
는 Date
객체를 반환한다. (엄밀히 말하면 타입은 그냥 ’object’지만, Date
객체를 따른다.)
new Date(); // Sat Jan 08 2022 23:52:00 GMT+0900 (한국 표준시)
Date.now(); // 1641653520000
new Date()
로 생성한 Date
객체에서 getTime()
메서드를 호출하면 Date.now()
와 같은 number
타입의 timestamp를 얻을 수 있다.
const date = new Date();
date.getTime(); // 1641653520000
Ref https://ko.javascript.info/date
…제목의 ‘a hundred’를 주의했어야 했다. 진짜 백 개라니. 포기 🤮
Ref https://threadreaderapp.com/thread/1470613731071696896.html
Ref https://www.youtube.com/playlist?list=PLhQjrBD2T383f9scHRNYJkior2VvYjpSL
코로나 격리해제됐다. 나름 잘 놀고 오고, 빡빡하게 친구들도 많이 만났다. 그리고 내일모레면 이제 다시 수술실과 입원실로(…) 들어간다. 이건 예상에 있던 거니까 딱히 우울하진 않다. 입원하는 동안 조용히 할 것들이 많아서 설레기까지 한다(?)
우테코에서 우형으로 크루들 중 절반 정도가 이번주에 입사했다. 톡방이 매일같이 시끌시끌하더니, 금요일 저녁부터 조용해졌다. 벌써 지친게야 🤦♀️ 조잘조잘 말하는 내용들을 조금씩 주워담으며 입사 마음가짐을 해본다.
졸업한 주제에 학교 포털에서 여전히 SNUON 강의를 들을 수 있어서, 작년 1월에 절반쯤 듣다 우테코가 너무 빡세 포기했던 컴퓨터구조 강의를 다시 듣고 있다. CS에서 네트워크가 제일 중요하다고는 들었는데, 살짝 찍먹했던 컴퓨터구조 수업도 나름 흥미로웠다. 이때 아니면 언제 공부해보겠어.
아이패드 에어를 구매했다. 신학기 프로모션 열린 당일에 후닥 구매해서 애플스토어까지 가서 직접 픽업했다. 케이스는 맘에 드는 게 하나도 없지만 그래도 적당히 괜찮다 ㅎㅎ 열심히 공부해야지. 좋은 인연이었던 아이디어스에서 드로잉 클래스 수강권도 구매했다!