Flutter를 이용해서
작은 SNS 플랫폼을 제작하고 있는데,
단순히 포스트와 채팅기능을 기획했습니다.
백 구성을 Full firebase로 제작해보고자 처음 Firebase를 이용하고 있는데,
저같은 실수를 범하지 않으시길 해서 글을 남겨봅니다.
Flutter를 이용해서 서버 데이터를 가져오는 페이지를 구현할때,
Futurebuilder 혹은 Streambuilder 를 이용해서 위젯을 구성하게 될텐데요,
실시간 데이터베이스를 사용한다면,
Futurebuild건 Streambuilder건 snapshot을 찍었을때, 데이터의 순서가 정렬되서 들어오지 않습니다.
(실시간 데이터베이스가 거대한 json구조라 당연한 얘기일 수도 있지만.. 사용하는 입장에서는 정렬되서 들어오면 좋겠죠?ㅜㅜ)
이건 Query문(orderByChild)를 해도 마찬가지로,
데이터의 구간을 잘라서 들고오는 건 가능하지만 그 데이터가 정렬되어 있지 않아, 클라이언트에서 입맛에 맞게 정렬하는 작업을 다시 해주어야합니다.
데이터를 정렬하고 쓰면 되지 않을까하지만, 이게 문제가 되는 부분이 Pagination을 구현할때 매우 코드 복잡성이 늘어납니다.
pagination을 구현할때 현재 페이지값을 저장하고, 다음으로 넘기기위해 setState를 호출할 경우가 생기는데,
Futurebuilder 및 Streambuilder 내에서 setState 호출은 위젯 무한 rebuild를 야기할 수 있어 권장되지 않는 부분입니다.
하지만, FIrestore의 경우에는 Query문도 훨씬 강력하고, 데이터도 순서대로 잘 들어오기 때문에,
클라이언트에서의 작업이 훨씬 간편해지는 편이 있어, post와 채팅기능들은 모두 Firestore로 이관하는 작업을 진행하였습니다.
다만 순서가 필요없고, 그때 그때 데이터를 색인해서 사용하는 간단한 회원 정보 같은 기능들만
실시간 데이터베이스에 남겨두는 식으로 작업을 하였습니다.
실시간 데이터베이스의 경우에는 아무리 구글링을 해도,
정렬을 제대로 받아올 수 없고, 클라이언트에서 처리하는 방법만 권장하더라구요.
덕분에 코드가 매우 더러워지구요..
플러터로 프로젝트를 진행하시는 분들이 계시다면, 아무리 가볍게 사용해보려고 하시더라도,
실시간 데이터베이스보다는 Firestore로 시작하시는 것을 추천드립니다.
감사합니다.
언젠간 도움이 되겠어요.
저도 뭔가 하나 시작해보고 싶은데 그만한 열정이 잘 생기지 않네요.
일년전만해도 라이브러리들이 대부분 베타버전이라 난감했었는데 ㅎㅎ
뭔가 제대로 된 크로스플랫폼 생태계가 자리잡았으면 좋겠어요 ㅠㅠ RN도 그렇고 Flutter도 그렇고 애매한 부분이 아직 많네요.