채팅방을 개설하고, 해당 채팅방의 유효기간이 지났더라도 그 채팅방을 참여하고 있다는 기록이 서버 내 기록에 삭제되지 않았기 때문에, 지속적으로 Follow up 하는 오류가 있음.
Firebase Collection에 지속적으로 리스닝을 하기때문에 불필요한 소모가 발생
개인은 자신이 참여한 Room의 모든 문서에 실시간 데이터 수집을 하는 중인데(User_ID - Room),
RoomEndTime이 지나간 Room도 참고 중에 있는 문제가 있음
Chat Data를 저장하는 Chat_Room에는 해당 시간이 지난 Room의 데이터들은 이미 삭제가 된 상태임.
즉 사용자가 실체가 없는 Document를 참고하고 있는 중임(Chat_room - Message)
해결방법
최초 로그인 시-체팅의 RoomEndTime을 확인하고, 현재 그 시간을 지난 시간이라면 더이상 Follow up 할 필요가 없으니 그 해당 Document를 삭제해주는 절차를 밟자
위 처럼, 앱시작 시 개인이 참여한 모든 채팅방에 대해서 초기화 과정이 이뤄지고, 시간이 지난 채팅방에 대한 처리가 없었으나 아래와 같
이 변경하면서, PAST채팅방에 대한 처리를 실행함
PAST타입을 추가로 정의해주고
sealed class RealTimeDataResult<T> {
data class Added<T>(val data : T) : RealTimeDataResult<T>()
data class Modified<T>(val data:T) : RealTimeDataResult<T>()
data class Deleted<T>(val data : T) : RealTimeDataResult<T>()
data class Past<T>(val data : T) :RealTimeDataResult<T>() // 추가
companion object{
fun <T> added(data : T) = Added<T>(data)
fun <T> modified(data : T) = Modified<T>(data)
fun <T> deleted(data : T) = Deleted<T>(data)
fun <T> past(data:T) = Past<T>(data)// 추가
}
}
Data Layer에서 Past로 분류될 데이터를 분류하는 동작을 추가한다.
suspend fun addRoomListener(id : String, nowDate : Date) : Flow<RealTimeDataResult<RoomNetworkData>> =
roomDataSource.getMyRoom(id)
.transform { result ->
if (result is RealTimeDataResult.Added &&
(result.data.roomEndTime ?: Date()) < nowDate
) {
emit(RealTimeDataResult.past(result.data))
} else {
emit(result)
}
}
ViewModel에 Past타입에 대한 동작을 실행해준다
ViewModel이 아닌 UseCase나 Repository, Service에서도 할 수 있지만, 이미 leaveChatRoom이 구현된 ViewModel(UILayer)에서 구현했음
ViewModel{
....
is RealTimeDataResult.Past ->{
leaveChatRoom(it.data.roomFid){
//제거하는 동작
}
}
....
}
지난 대화방은 로그인 시 제거되는 모습을 볼 수 있었다.(결과 만족)
(개선사항)
위에서 ViewModel의 leaveChatRoom 함수를 실행하면
1) 채팅 실시간 추적 중지 + 2) 채팅방 캐시 데이터(Room Database)삭제가 둘 다 이뤄지므로,
1) 채팅 실시간 추적 중지만 실행시키기 위해 다음과 같이 변경함
suspend fun addRoomListener(id : String, nowDate : Date) : Flow<RealTimeDataResult<RoomNetworkData>> =
roomDataSource.getMyRoom(id)
.transform { result ->
if (result is RealTimeDataResult.Added &&
(result.data.roomEndTime ?: Date()) < nowDate
) {
emit(RealTimeDataResult.past(result.data))
} else {
emit(result)
}
}
.onEach {
if (it is RealTimeDataResult.Past){
roomDataSource.exitGroupChatRoom(it.data.roomFid)
}
}
.filterNot {
it is RealTimeDataResult.Past
}
'어플 개발일기' 카테고리의 다른 글
앱 개선사항(3. 소모임 나가기 로직 테스트) (0) | 2024.06.04 |
---|---|
앱 개선사항(2. 채팅방 뷰 및 알림 등 기능 개선) (0) | 2024.05.31 |
초기 세팅 중 발생한 문제 : Unsupported metadata version. Check that your Kotlin version is >= 1.0: java.lang.IllegalStateException: Unsupported metadata version. Check that your Kotlin version is >= 1.0 (0) | 2024.04.20 |
울릉공항 건설공사 현황 앱 개발(1) (0) | 2024.04.13 |
12.10 Android ChatApp(1) ChatBubble (0) | 2022.12.11 |