현업에서 간편 송금앱을 개발중인데 채팅 서비스도 포함이 되어있다. 개발하다보니 많은 문제점이 발생했다.
기존의 프로세스는 다음과 같다
앱에 접속해있는 상태에서는 websocket을 사용하기때문에 전혀 문제가 없었다. 하지만 백그라운드 전환한 경우에는 api통신을 통해 메시지 내역을 불러와야했다.
백그라운드 상태일때 받은 메시지가 많으면 많을수록 데이터 통신양이나 성능에 문제가 보였고 무엇보다 채팅방에 들어올때마다 사용자에게 좋지 않은 UX를 주는게 별로였다. 사용자 입장에서 느리고 좋지않은 경험이다
처음 입장할때 메시지 내역을 조회한다. 아무리 페이징처리해서 소규모의 데이터만 가져온다해도 대기시간이 존재한다. 카카오톡을 비교해보면 채팅방에 들어가기 전부터 채팅내역이 있고 부드러운 경험을 주고 있는데 우리 앱은 방에들어면 몇초간 하얀 스크린을 보고있다.
카카오톡 기능중 아래 이미지와같이 메시지 검색기능이 있다
우리앱에서도 구현을 하려고 할때 api통신을 통해 위치를 찾고 그만큼의 스크롤을 해줘야하는 로직이 필요하다. 구현중 백엔드개발자랑 협업중에 서버로직이 복잡하고 느리다라는 이야기를 듣게 되었고 백보다는 프론트에서 해결해야겠다는 생각이 들었다.위에 1번문제를 생각해봤을때 데이터를 프론트가 가지고있어서 api호출을 최소화하자는 생각이 들었다.
그러려면 데이터를 프론트에 저장을 해놔야한다 생각했고 로컬디비를 비교해 보았다.
각각의 장단점이 있고 상황에 맞게 쓰면 된다. 필자는 SQLite 골랐다 왜냐하면 그때는 구조가 복잡해질거같았고 스키마를 명확히 해야 할거 같았다 또, sql문이 더 익숙해서 골랐다 .
하지만 지금와서는 잘못된거 같다. Realm으로 속도도 더 빠르고 생각보다 디비구조가 복잡하지않아서 오히려 더 무거워진 느낌이다. 일정을 보고 조만간 Realm으로 마이그레이션을 진행해볼까한다
messagesByRoomKey: Record<string, IMessage[]>;
export interface IMessage {
...
}
채팅방에 들어오면 로컬디비에 마지막으로 저장된 값을 불러와서 그 값을 기준으로 이후의 메시지들을 조회하는 api를 사용한다.
조회된값을 로컬디비에 저장하면 다음에는 api 조회없이 로컬디비만으로 충분하다.