안드로이드 앱 업데이트 로직 구현

박민우·2022년 6월 18일
1

이번에 안드로이드 앱을 출시하며, 추후 유지보수를 위해 앱 업데이트 로직을 앱에 포함해야 했다. 출시 후에 유저가 앱을 사용하다 문제가 생기거나, 앱에 새로운 기능을 추가해야 하는 상황이 생기면, 새로운 버전으로 업데이트 해야되니까 😏

만약 앱 업데이트 로직을 코드에 포함하지 않는다면, 기본 플로우는 그냥 사용자가 구글 플레이 스토어에 들어가야 업데이트를 할 수 있도록 나오고, 이를 사용자가 확인하지 않는다면, 계속 업데이트 하지 않고 앱을 사용할 수 있는 방식인 것 같,,다. 아마도 ?? ㅋㅎ

우리 팀에게 필요했던 업데이트 로직은 👇🏻👇🏻 였다.

앱이 도중에 중단되는 등의 크리티컬한 버그나 문제를 해결하기 위한 업데이트라면, 사용자가 꼭 업데이트 하게 하도록 하고, 그게 아니라면 사용자가 선택적으로 업데이트 하도록 하자 !


📌 버전정보

이러한 앱의 업데이트 로직을 구현하기 위해선 앱의 버전을 설정해줘야 한다. 우선, 앱의 버전이란 우리가 구글플레이스토어에서 앱을 다운 받을 때 1.0.0, 2.0.1 등의 버전 정보라고 생각하면 된다.

우리가 이러한 앱의 버전을 설정해주기 위해 건드릴 수 있는(?) data는 크게 2개이다. 바로 versionCodeversionName 이다.

위의 그림에서 보듯이, 두 data 모두 module 수준의 build.gradle 파일에서 확인하고 값을 변경할 수 있다.

우선, 각 data에 대한 android 공식문서의 설명을 보면

  1. versionCode
  • 양의 정수이며, 내부 버전 번호로 사용된다. 이 번호는 한 버전이 다른 버전보다 최신인지 여부를 판단하는 데만 사용되며, 번호가 높을수록 최신 버전이다. 사용자에게 표시되는 버전 번호가 아니다. 사용자에게 표시되는 번호는 아래에 나와 있는 versionName 설정으로 지정된다.

  • 일반적으로 앱의 첫 번째 버전은 versionCode를 1로 설정하여 출시하고, 주 출시 버전이든 부 출시 버전이든 관계없이 각 버전마다 일정하게 값을 증가시킨다. 즉, versionCode 값은 사용자에게 표시되는 앱 출시 버전과 매우 유사할 필요는 없다(아래 versionName 참고). 앱과 게시 서비스는 사용자에게 이 버전 값을 표시해서는 안 된다.

  1. versionName
  • 사용자에게 표시되는 버전 번호로 사용되는 문자열이다. 이 설정은 원시 문자열이나 문자열 리소스의 참조로 지정할 수 있다. 값은 문자열로서, <major>.<minor>.<point> 문자열이나 다른 유형의 절대 또는 상대 버전 식별자로 앱 버전을 설명할 수 있다. versionName은 사용자에게 표시하는 것 이외에 다른 용도는 없다.

라고 하는데,,,,, 무슨 소린지 잘 모르겠다면 ? 👇

versionCode는 실제 앱 업데이트 로직을 구현할 때, 새로운 버전인지 판단하는 기준이되는 변수로 사용자에게 표시되지는 않고, versionName 은 실제 앱의 업데이트 로직에 사용되지는 않지만, 사용자에게 보여지는 버전 정보이다. 즉, 개발자들이 이용하는 버전정보와 사용자들이 보게 되는 버전정보는 서로 다르다는 것이다 !!

즉, 우리 같은 개발자들은 versionCodeversionName, 총 두 개의 변수의 값을 증가시키지만, 실제 업데이트를 판단하는 데 기준이 되는 것은 versionCode 이고, 사용자에게 보여지는 정보는 versionName 이라는 것이다 ! 그리고 사용자들이 구글 플레이스토어에서 보게되는 2.0.1 같은 버전 정보는 versionName 인 것이다 !


📌 인앱 업데이트

앱의 버전을 구성하는 정보들을 알게 되었고, 본격적으로 앱 업데이트에 대해서 찾아보다가, 인앱 업데이트라는 기능을 알게 되었다 !

인앱 업데이트란?
👉🏻 간단히 말해서 사용자가 앱을 실행했을 때, 사용자에게 "앱을 업데이트하라"는 팝업 메시지를 표시하고 앱 안에서 업데이트를 가능하게 하는 (플레이스토어에 들어가지 않고) 기능이다. 그래서 in app update 인가? 이름 잘 지었네 ㅇㅈ

인앱 업데이트에는 크게 2가지 흐름이 있는데

1. 유연한 업데이트 (Flexible updates)


=> 유연한 업데이트는 사용자가 앱을 시작했을 때, 팝업 메세지로 업데이트를 알리고, 업데이트를 선택적으로 진행할 수 있도록 하는 흐름이다. 백그라운드에서 다운로드를 진행하기 때문에, 사용자가 업데이트를 하는 동안 앱을 사용할 수 있다! 그렇기 때문에 앱에 핵심 기능이 아니지만 새 기능이 추가되었을 때 사용하면 좋은 업데이트 방식이다. 약간 "새로운 기능 나왔는데, 업데이트 하면 좋고~~ 근데 뭐 안해도 되고~~ 심지어 앱 사용하면서 업데이트 할 수 있고~~ 이래도 안해? 이런 느낌인 것 같다 ㅋㅎ

하지만 우리 팀에서 필요한 업데이트 로직 상, 크리티컬한 문제가 아니라면, 따로 앱 시작 시 팝업을 띄우는 것도 아니고, 사용자가 구글플레이스토어에 들어가서 선택적으로 업데이트 할 수 있도록 할 것이기 때문에 굳이 앱 안에서 선택적 업데이트를 구현할 필요가 없어서 이 유연한 업데이트 방식은 사용 안할 것이므로 그냥 읽고 pass 했다 ~~

2. 즉시 업데이트 (Immediate updates)

=> 즉시 업데이트는 사용자가 앱을 계속 사용하려면 앱을 업데이트하고 다시 시작해야 하는 전체 화면 UX 흐름이다. 즉, 사용자가 앱을 실행하면, 즉시 업데이트를 요구하는 팝업 메시지가 띄워지고, 업데이트를 하지 않으면 앱을 사용할 수 없도록 하는 업데이트 흐름이다. (하지만, 위 화면에서 x 버튼을 누르면 앱을 사용가능하므로, 앱을 사용하지 못하게 하는 기능을 코드로 추가적으로 구현해줘야한다ㅋ. 추후에 코드로 설명할 것!) 사용자가 즉시 업데이트를 수락하면 Google Play가 업데이트를 진행하고, 앱을 다시 시작한다.

👉🏻 이 즉시 업데이트가 우리 팀에서 필요한 업데이트 로직이다 !

쉽게 정리하면

  • 중요한 업데이트 => 인앱 업데이트 중 즉시 업데이트로 구현
  • 덜 중요한 업데이트 => 사용자가 알아서 구글 플레이 스토어 들어가서 업데이트

이런식으로 구현할 것이다 !

즉시 업데이트에 대한 자세한 구현 방법과 실제로 코드에 적용한 결과는 다음 글에서 설명하겠다 👀


🙇🏻‍♂️ 참고 및 출처

profile
꾸준히, 깊게

0개의 댓글