그렇다, 쓸 거리가 너무 많아서 도무지 글을 쓰는 것을 시작할 수 없었다.
이것은 마치 삼류 소설 인트로 같다고 생각하고 소설을 읽은지 오래되었으니 아무래도 굉장히 아웃데이티드 된 개 구린 인트로일 것이다.
흑흑
참신하게 흑흑 좋네
내 마음이다 흑흑흑 하는 내 마음
아니 도대체 에러 없는 날이 없는것이다.
이렇게 하면 이러한 에러가 나고
저렇게 하면 저러한 에러가 나고
영어를 잘 한다고 생각하며 사는데 (한국말도 못하니까 비슷하다) 영어 에러 메세지는 왜이리 안 읽히고 읽기도 싫은지
그냥 쫙 다 긁어서 구글에 검색해본다.
그러면 이제 스택 오버플로우에 같은 에러에 고민했던 사람의 글이 최상단에 노출되고
그걸 읽어보는데 또 영어야
그러니까 또 집중해서 읽고
이러는 날들이다.
아니 왜 또 새벽엔 잠이 안오고 그래서 컴퓨터 하다가 자면
막 꿈에서 컴퓨터하고있고
깨어서는 집중 안되니까 유튜브 플레이리스트를 신중한 병아리 감별사처럼 골라 듣고 있고
아주 마음에 드는 날들이다
진짜임.
왜냐면 숙원사업을 진행하고 있기 때문이다.
이거 만들어 볼테야~
하고 생각한게 작년 10월인가 아니다 제작년 10월인데
회사 다니느라 이리 미루고 저리 미루고 하고
또 앱 개발은 해 본 적 없어서 배워서 해야하니 이거 조금 읽고 저거 좀 읽고 저거 좀 해보다 이거 좀 해보다 하며 성과가 없었는데
지금은 그래도 조금씩 뭐가 만들어진다.
전부 내 힘으로 만들지는 못하고
한달에 20달러로 고용한 시니어 코딩 매니저와 함께, a.k.a cursor.ai
[본문]은 여기서부터 시작
파이어스토어에 저장한 데이터를 소팅해서 다시 화면에서 보여줄 일이 있다. 레코드 소팅을 해서 랭킹 페이지를 만들 계획이다.
이걸 하는데 클라이언트 사이드에서 소팅해서 보여주는 것도 방법이다. 즉각적이고 서버 부하가 적어질 수 있다. 하지만 클라이언트가 개별 연산된 결과를 보여주는 경우, 그 결과가 통일되지 않은 상태일 수 있다. 내가 보는 순위랑 저 친구가 확인하고 있는 순위 내용이 다를 수 있다. 서버 사이드에서 연산을 해서 보여주게 되는 경우, 보안이 강화된다. 클라이언트 사이드에서 위변조 할 수 없기도 하고, 그리고 랭킹 데이터가 중앙에 떡 하니 자리 잡고 있기에 각 클라이언트가 출력하는 결과물은 동일하다.
그래서 파이어베이스를 백엔드로 사용하고 있으므로, 파이어베이스에서 지원하는 Functions를 사용하기로 했다.
플러터 프로젝트 안에 functions 디렉토리가 만들어지고, 그 안에 자바스크립트 파일들이 생겼다. 타입스크립트로 해 볼 걸 그랬나?
그런데 firebase deploy --only functions 이렇게 하면 에러가 뜬다.
"TypeError: functions.firestore.document is not a function"
"Error: Functions codebase could not be analyzed successfully. It may have a syntax or runtime error"
이것 저것 찾아보니, 업데이트된 파이어베이서 펑션 api에 맞지 않는 코드로 작성된 내용을 실행하려 하니 발생한 문제였다.
이전 내 코드는
// Firestore 트리거 함수
exports.updateRanking = functions.firestore
.document("records/{recordId}")
.onWrite(async (change, context) => {
const recordId = context.params.recordId;
const recordsData = change.after.exists ? change.after.data() : null;
여기서 functions.firestore 이거를 지금 버전에서 쓰려고 하니 문제가 생긴거였다. 그 코드를 그대로 쓰고싶다면, 패키지 제이슨을 확인해서, firebase-functions 버전을 내려주면 되는데, 좋은 생각은 아닌 듯 하다.
const { onDocumentWritten } = require("firebase-functions/v2/firestore"); // 추가~
exports.updateRanking = onDocumentWritten(
"records/{recordId}",
async (event) => {
const recordId = event.params.recordId;
const recordsData = event.data?.after?.data() || null;
이런식으로, onDocumentWritten 이걸 사용하니, 해당 에러는 넘어갔다. 하지만 또 다른 에러를 마주하고 있다.
산 넘어 산,,
에러 넘어 에러,,
행복한 일요일이다.