제가 학습 목적으로 만든 특별공급 알리미는, 신규 사용자에게 신뢰감을 주기 위해 현재 알림 구독자의 수를 화면에 표시하고 있습니다.
구독자의 수는 Cloud Messaging 서비스의 Token 값을 Cloud Firestore에 저장한 후, 필요시 저장된 Token의 개수를 화면에 표시합니다.
하지만 Firebase Cloud Firestore는 Collection에 포함된 문서(Doc)의 갯수를 제공하는 기능이 따로 없어, 다음과 같이 모든 저장된 Token을 읽어온 후, 여기에서 크기 값만 제공하는 형태로 구현해 사용하였습니다.
Cloud Function:
db.collection('...').get().then(snap => {
res.status(200).send({length: snap.size});
});
Front End:
yourHttpClient.post(yourCloudFunctionUrl).toPromise().then(snap => {
size = snap.length // will return the collection size
});
하지만 사용자가 늘어남에 따라 다음과 같은 문제가 발생하였습니다.
- 등록된 Token의 갯수 만큼 조회하여 표기하므로 점차 반응 시간이 느려짐
- 비용이 발생할 가능성이 있음 (사실 아직 그 정도 규모의 서비스는 아님)
최근에 이를 개선해보고자 구글을 검색한 결과 Firebase에 Counter기능이 추가되었으며 이에 따라 코드를 다음과 같이 수정할 수 있었습니다.
Cloud Function:
export const UserIncrement =
functions.firestore.document('collection/{documentUid}')
.onCreate((snap, context) => {
db.doc(docRef).update({numberOfDocs: FieldValue.increment(1)});
});
export const UserDecrement =
functions.firestore.document('collection/{documentUid}')
.onDelete((snap, context) => {
db.doc(docRef).update({numberOfDocs: FieldValue.increment(-1)});
});
...
db.doc('...').get().then(snap => {
let Cnt = await snap.data();
res.status(200).send({length: Cnt.numberOfDocs});
});
Front End:
yourHttpClient.post(yourCloudFunctionUrl).toPromise().then(snap => {
size = snap.length // will return the collection size
});
제약사항
1초에 1회의 Update로 제한되므로 실시간으로 Count를 갱신해야 한다면 Distribute Counter를 고려해보아야 합니다. 하지만 제 경우는 이 정도로 데이터가 필요하지는 않기 때문에 그대로 사용하여도 무방합니다.
참고
'모듈, 프레임웍 > Firebase' 카테고리의 다른 글
[Firebase] Cloud Function Node.js 런타임 업그레이드 (0) | 2021.01.27 |
---|---|
Firebase JavaScript SDK 7.18.0 - Cloud Messaging (0) | 2020.08.17 |
Firebase Cloud Messaging - 푸시 메시지 유형 및 수신 (0) | 2020.08.11 |
Firebase Cloud Messaging - 클라이언트(JavaScript) 설정 (0) | 2020.07.28 |
Firebase 호스팅 사용하기 - Custom Domain 연결 (0) | 2020.07.21 |