Firebase 원격 구성(Remote Config)를 사용할 때는 세 가지 주요 단계가 있습니다.
- 원격 구성 기본값을 설정합니다. 코드 상에서 직접 값을 지정하거나, plist 또는 xml 파일에서 필요한 값을 가져올 수 있습니다. 이 과정은 서버 작업 없이 클라이언트 측에서 이루어 집니다.
fetch()
를 호출하여 클라우드에서 새로운 원격 구성 값을 내려 받습니다.
- 마지막으로,
activateFetched()
를 호출하여, 위에서 내려 받은 새로운 원격 구성 값으로 기존 데이타를 덮어 씁니다.
이 때, 클라우드 상에서 내려 받기를 요청하면, 기본값과 다른 값만 다운로드합니다. 네트워크 호출은 최소로 유지 되면서도 클라우드를 통해 앱에 적용될 원격 구성 값을 변경 할 수 있습니다.
꽤 수월해 보이지요? 대부분의 경우 실제로 그렇게 어렵지는 않습니다. 다만, 한 가지, 당연히 두 번째 단계를 진행하기 위해서는 네트워크 호출이 필요합니다. 실제 상황에서는 사람들이 터널, 엘리베이터, 사막 또는 네트워크 연결이 불안한 장소에서 앱을 사용할 때도 있습니다. 네트워크 호출 완료에 얼마나 걸릴지 알 수가 없습니다. 다시말해, 사용자가 앱을 사용하기 전에 이 프로세스가 완료될 것이라 보장할 수 없습니다.
이런 점을 염두에 두고, 다음 세 가지 전략을 사용할 수 있습니다.
전략 1: 활성화 및 새로고침
가장 직관적인 방법입니다. 샘플 앱과 구현 가이드에서도 동일한 방법이 사용됩니다. 클라우드에서 새 원격 구성 값을 다운로드한 후 완료 핸들러에서
activateFetched()
를 호출하여 즉시 적용한 다음, 새로운 원격 구성 값을 적용해 UI 혹은 그 외 다른 요소를 업데이트 합니다.
이 방식을 적용하면, 사용자가 원격 구성 값이 로드되는 것을 기다리지 않고, 앱을 바로 이용할 수 있다는 장점이 있습니다. 그러나 원격 구성 값 업데이트가 앱 사용 중에 발생하면, 사용자가 앱을 사용하는 중간에 갑자기 버튼 텍스트, UI 배치 또는 기타 중요한 값 등이 변경될 수 있습니다. 이는 사용자를 혼란스럽게 만들 수 있고, 때문에 많은 개발자들은 다음과 같은 솔루션을 선택합니다.
전략 2: 로딩 화면 추가
매우 일반적인 방법으로 사용자가 처음 앱을 시작할 때 로딩 화면을 표시하는 것입니다. 이전과 마찬가지로 완료 핸들러에서
activateFetched
를 호출하여 즉시 새로 내려받은 값을 적용합니다. 업데이트가 완료되면, 로딩 화면을 닫고 콘텐츠를 표시합니다. 사용자가 로딩 화면을 지나서 앱으로 진입할 때,
'거의 확실히' 새 값을 다운로드하고, 다음 단계로 진행할 수 있다는 점에서 유용합니다.
가장 큰 단점은 로딩 화면이 있다는 것입니다. 사용자가 앱에 진입하는 데 장애가 될 수 있습니다. 그러나 앱 시작 시 꼭 필요한 그 외 다른 작업 혹은 네트워크 호출이 있다면, 큰 문제가 아닐 수 있습니다. 다른 초기화 작업들과 함께 원격 구성 값을 가져오면 됩니다.
하지만 앱에 아직 로딩 화면이 없다면, 다른 방법을 시도해봐도 좋습니다. 바로 다음과 같은 전략 말이죠.
전략 3: 다음 차례를 위한 값 로드
이 방식은 약간은 직관에 반하는 것처럼 보일 수 있습니다. 사용자가 앱을 시작하면, 즉시
activateFetched()
를 호출합니다. 그러면 이전에 클라우드에서 가져온 기존 값이 적용됩니다. 그 후, 사용자가 앱을 사용하는 동안, 비동기
fetch()
호출을 시작하여 클라우드에서 새 값을 가져옵니다. 이 때, 호출이 완료되어도 추가적인 작업을 하지 않습니다. 클라우드에서 가져온 값은 사용자가 다음에 앱을 시작해서,
activateFetched
를 호출할 때까지 기기의 로컬 위치에 저장됩니다.
이 전략은 사용자가 즉시 앱을 사용할 수 있다는 점에서 매우 유용하며, 앱의 인터페이스도 갑자기 변경되지 않습니다. 분명한 단점은 사용자가 업데이트된 원격 구성 값을 보려면 반드시 앱을 다시 시작해야 한다는 점 입니다. 이러한 방식의 여러분의 앱에 적합한지 판단이 필요합니다.
원격 구성을 사용하여 타워 방어 게임의 일부 값을 미세 조정하는 경우라면 아마도 괜찮은 방법일 것입니다. 하지만 요일별 메시지 또는 특정 날짜별 콘텐츠를 전달하려고 원격 구성을 사용할 경우에는 그렇지 않을 수도 있습니다.
전략 3.5: 전략 2와 3 또는 전략 1과 3을 혼합한 전략
원격 구성의 한 가지 장점은 마지막으로 성공한
fetch()
호출이 수행된
시간을 알려줄 수 있다는 것입니다. 따라서 가장 최근에 가져온 원격 구성 데이터가 얼마나 오래되었는지 먼저 확인하는 혼합형 전략을 세울 수 있습니다. 원격 구성 데이터가 비교적 최근 데이터라면(예: 지난 48시간 가량의 데이터) "가장 최근 값 일괄 적용 후 다음 차례를 위해 다른 가져오기 수행" 전략을 실행할 수 있습니다. 그렇지 않으면 이전 두 가지 전략 중 하나를 수행할 수 있습니다.
캐싱에 대한 논의
로딩 전략에 대해 이야기하자면, 관련 주제인 캐싱을 빠뜨릴 수 없습니다. 개발자가
fetch()
를 호출할 때마다 원격 구성의 값을 즉시 가져오지 않습니디. 해당 값은 12시간 동안 캐싱됩니다. 이 점이 때로는 개발자를 혼란스럽게 합니다.
이 캐시 시간을 다소 단축할 수는 있지만 네트워크 호출을 너무 자주 시작하면 클라이언트 또는 원격 구성 서비스에 의해 앱이 제한되기 시작할 수 있습니다.
그렇다면 왜 처음부터 이러한 캐싱과 호출 제한이 생긴 걸까요?
부분적으로는 앱이 수백만 명의 사용자로 확장되더라도 서비스를 무료로 유지할 수 있는 방법이기 때문입니다. 제대로 동작하는 캐싱을 추가함으로써 앱의 인기도에 상관없이 서비스를 통해 무료로 앱을 처리하도록 할 수 있습니다.
또한, 이것이 잘못된 코드로부터 서비스를 보호하는 훌륭한 방법이기도 하기 때문입니다. 물론 여러분은 아니겠지만, 실수로
fetch()
를 너무 자주 호출하는 개발자들이 있습니다. 우리는 그 중 한 개발자가 실수로 DDoS 공격을 실행하여 전체 서비스가 중단되는 것을 원치 않습니다. 클라이언트 측 라이브러리가 캐시된 값을 제공하고 빈번한 네트워크 호출을 제한하면 서비스를 안전하게 유지하는 데 도움이 됩니다.
그러나 이는 사용자에게도 좋습니다. 훌륭한 캐싱 전략은 앱이 너무 자주 불필요한 네트워크 호출을 수행하여 사용자의 배터리 및 데이터를 낭비하지 않도록 방지할 수 있습니다.
원격 구성 구현을 개발하고 테스트하는 동안 이러한 제한이 불편할 수 있습니다. 이 경우,
개발자 모드를 활성화하여 로컬 제한 동작을 회피할 수 있습니다. 그러나 실제 상황에서는 사용자가 매일 여러분의 앱을 사용하고 있다고 해도 이런 유형의 캐싱 동작은 대개 유용합니다.
하지만 그보다 더 자주 값을 푸시하고 싶다면 어떻게 해야 할까요? 원격 구성을 통해 일종의 "시간의 메시지" 기능을 제공하려는 경우에는 어떻게 해야 할까요? 솔직히 말해서, 이것은 원격 구성 서비스가 이상적인 솔루션이 아니라는 신호일 수 있습니다. 대신 좀 더 적시에 Realtime Database를 사용하는 것을 생각해봐야 합니다.
반면, 긴급한 원격 구성 업데이트를 가끔씩만 적용하려는 경우가 있을 수도 있습니다. 아마도 실수로 최근의 변경 사항을 일괄적으로 적용하는 바람에 인앱 결제 데이터를 망가뜨린 경험이 있을지도 모르겠습니다. 그래서 모든 이가 즉시 새로운 값을 얻기를 바랄 수도 있을 것입니다. 그렇다면 어떻게 하면 캐시를 우회하여 클라이언트가 강제로 가져오기를 수행하도록 할 수 있을까요?
한 가지 해결책은
Firebase 클라우드 메시징을 사용하는 것입니다. FCM을 사용하면 모든 기기에 데이터 전용 알림을 보내 긴급한 업데이트가 보류 중임을 알릴 수 있습니다. 앱은 일종의 플래그를 로컬에 저장하는 방식으로 이러한 수신 알림에 응답할 수 있습니다. 앱은 사용자가 다음에 앱을 시작할 때 이 플래그를 찾을 수 있습니다. true로 설정하면 캐시 시간이 0인 가져오기를 수행하여 즉시 가져오기를 보장할 수 있습니다. 완료되면 이 플래그를 다시 원래대로 설정해야 앱이 평소의 캐싱 동작을 계속할 수 있습니다.
원격 구성 서비스에서 새 값을 즉시 깨우고 가져오는 방식으로 클라이언트가 이 수신 알림에 응답하도록 하고 싶으시겠지만, 앱의 모든 인스턴스가 한꺼번에 이를 수행하면 서버 측 제한에 걸릴 가능성이 매우 높으므로 권장하지 않습니다. 대신 위에서 제시한 전략을 고수하세요. 그러면 모든 사용자가 앱을 여는 데 걸리는 시간에 걸쳐 네트워크 호출이 분산될 것입니다.
원격 구성에서 값을 로드하기 위한 몇 가지 팁과 요령이 있답니다. 혹시 자신만의 요령이 있나요?
YouTube 동영상에 이런 팁이나 요령을 댓글로 써서 공유하거나
Firebase Talk 그룹의 이야기를 듣고 원격 구성 구현을 어떻게 진행할지 알려주세요.