파이어베이스_통신_딜레이 - boostcampwm-2024/and04-Nature-Album GitHub Wiki

💥 파이어베이스 통신 딜레이

문제 정의

Firebase 서버에 데이터를 저장, 데이터를 불러올 때 다음과 같은 코드를 사용

fun insertData(): String {
	var returnValue: String? = null
	firestore.collection().document().get()
		.addOnSuccessListener { document ->
          returnValue= document.data["data"] as String
      }
      
  return returnValue
}

이 경우 데이터 전송에 대한 성공 여부를 얻기도 전에 return이 먼저 실행된다.

이는 파이어베이스 통신 속도가 느려 일어나는 문제로 기존의 문제 해결 방법은 다음과 같다.

ViewModel 에서 StateFlow 또는 LiveData를 이용하여 변화를 감지하여 처리하면 된다.

그러나 이 경우 데이터 변경까지 UI가 멈추거나 로딩 처리를 해주어야 하며, 이 경우 사용자에게 불편함을 줄 수 있다고 생각했다.

물론 필요하다면 해야겠지만 우리 프로젝트 특성 상 불필요한 기다림이라고 판단

문제 해결 방법

불필요한 이유는 다음과 같다.

  1. 프로젝트의 데이터 메인은 Room, LocalDatabase로 UI에 보여지는 데이터 또한 Room을 통해 가져온다. 즉, 서버 통신과 UI는 전혀 상관관계가 없다.
  2. 서버 데이터가 필요한 경우는 Room Data가 날라가 동기화 시켜줄 때, 친구의 도감을 확인할 때

로그인 상태에서 도감을 등록하면 Room과 Firebase에 저장을 해주는데 Firebase에 저장하는 것을 기다릴 필요가 없다 판단하여 백그라운드에서 저장시키는 방법이 좋을 것 같다 판단

어차피 동기화 또한 백그라운드에서 진행해야하기 때문에 겸사겸사 진행하기로 마음 먹었습니다.

문제 해결 진행

백그라운드에서 진행하기 위해서는 **Service**에 대해 알아야 한다.

백그라운드 Service 사용하기

Service를 사용한 이유

  1. 앱이 켜져 있는 동안 서버에 저장
  2. 저장하는 동안 사용자는 자유롭게 앱을 사용할 수 있음
  3. 코루틴 작업에 대한 관리를 더 용이하게 할 수 있음

과정

  1. 도감을 등록할 때 네트워크 연결이 되어 있는지, 로그인 상태인지 확인한다.
    1. 네트워크 연결 및 로그인 상태 시 계속 진행
    2. 연결과 로그인이 둘 중 하나라도 안되어 있다면 return
  2. 도감 등록에 필요한 데이터들은 intent를 통해 Service로 넘겨주고 실행
  3. Service의 onStartCommand에서 코루틴을 통해 저장
  4. 성공 또는 실패 시 Service 내에서 Service 종료
  5. Service의 onDestroy()에서 job.cancel() 진행

결과

  • 사용자는 기존의 Local Database에 저장 후 빠르게 도감을 확인 할 수 있다.
  • 도감을 확인하는 동안 Service 백그라운드에서 Firebase 저장 작업을 실행하며 서버에 제대로 등록되는 것 확인
  • 앱이 유휴상태에 들어가도 하나의 도감 저장의 소요시간은 4초 정도 걸리기 때문에 강제 중지 되기 전에 완료
  • 사용자가 도감 저장 후 곧 바로 앱을 종료하면 저장이 안되는 문제가 있긴 하지만 추가적인 동기화 작업을 수행하기 때문에 문제가 없다고 판단하였다.