Firestore limit 쿼리를 onSnapShot으로 실행 시 이슈

도무지 방법을 찾지 못하겠습니다. 고수님들 도와 주세요~

예를 들어…
채팅 앱에서, 채팅방 목록을 보여주는 화면을 구현하는데, 채팅방 제목과 만든날짜를 목록에 렌더링 한다고 가정합니다.

파이어스토어 쿼리는 만든날짜 역순이며, 페이징 처리를 위해 한번에 5개씩 읽어오게 했습니다. (limit 5)

화면 로딩 이후에 타인이 채팅방의 제목을 변경했을때 자동으로 변경 적용이 되도록 하기 위해서
onSnapShot 으로 콜백을 정의하고, added, modified, removed 코딩을 다 해둡니다.

예상한대로 페이지 로딩 이후 modified 는 잘 동작하며, 수정된 채팅방 제목을 화면에서 변경도 잘 시켜주었습니다.

그런데, 채팅방이 추가되어 added 를 통해 데이터 추가 로딩이 된 이후에는
첫번째 페이지에서 읽었던 5번째의 채팅방(추가 데이터 로딩 후 이므로 이제 6번째)의 데이터 수정에 대한 modified 콜백이 실행되지 않습니다.
onSnapShot 콜백으로 아무것도 들어오질 않네요…

마치, 최근 추가된 채팅방 데이터는 만든날짜 역순 기준에 따라 1페이지의 첫번째 데이터에 해당하므로, 1페이지의 Listener에 로드 되는데,
이 Listener는 limit 5 제한 되었기 때문에, 마지막 데이터는 이 Listener의 관리에서 제외 되는 것 같습니다…
(느낌적인 느낌입니다… ㅠ)

이 문제를 어떻게 해결할 수 있을까요?

여러 고수님들의 조언을 부탁 드립니다.

질문하신 것과는 좀 다른 이야기를 먼저 하게 되어 미안하지만, paging을 하게 될 때, 저는 페이지별로 onSnapShot을 들고 있게 합니다. 그래서 각 변경이 일어날 때마다 갱신이 일어날 수 있지요. 이렇게 할 경우에 본의 아니게 같은 데이터를 두 번 이상 watch하고 있는 경우가 생길 수 있겠죠. 뭐 어때 그냥 두번 갱신시키지 그렇게 써도 큰 문제는 없을 거 같아요. 근데 질문하신거 처럼 이가 빠져버리는 경우가 생길 수 있겠죠.

질문처럼, 1, 2, 3, 4, 5 번 채팅방 정보가 잘 들어왔는데, 0번이 추가 되면서 0, 1, 2, 3, 4, 5 번이 되면서 5번이 onSnapshot에서 제외되어 버리는 건 추측하신 이유가 맞습니다. 그럼 어떻게 해야 하나? 지금 쿼리 ‘처음부터 몇 개 가져와줘’ 으로는 어쩔 수 없다고 생각됩니다. 마지막 아이템을 저장하고 있으면서 해당 아이템의 인덱스 이후에 몇개를 가져오도록 관리해줘야 합니다.

이 경우에 또 주의할 점이 마지막 인덱스를 지워버리는 경우에는 마지막 인덱스 다음에 것을 가져올 수 없게 되는 문제가 있었던 거 같아요. 그래서 마지막 아이템을 지울때는 그 직전의 것으로 다시 저장해두는 게 필요할 거 같은데 저도 기억이 잘 안나네요.

저도 이부분에서 삽질을 많이 했던 기억이 납니다. 해결책은 언제나 있습니다. 긍정적으로 찾아보세요.

아, 정말 감사 드립니다…
제가 헤매고 있던 내용에 정확히 필요한 부분을 말씀해주셨습니다.
저도 페이지 별로 onSnapShot을 들고 있는 것과 동일하게 하고 있었기 때문에 질문한 것과 다른 이야기가 아니에요~ ^^

답변해주신 내용중에 두번이상 watch하는 경우가 어떤 것일까 궁금했지만,
간단히 테스트 해보니 한개 페이지의 데이터가 삭제 되면, 그 onSnapShot은 그 다음 페이지에 해당하는 데이터를 추가하기 때문에 결국 다음페이지의 onSnapShot과 동시에 리스닝을 하게 되네요…

암튼, 답변해주셔서 많은 도움이 되었습니다. 이제 특성(?)을 알았으니… 로직 구현이 남았지만요. ^^

1 Like