글의 목표
이번 글에서는 플러터 출시한 앱의 버전을 관리하는 방법에 대해 알아본다.
IOS와 Android는 버전 스트링을 다루는 방식이 서로 상이한 부분이 있다. 그러나 버전 관리는 같은 플러터 프로젝트에서 해주기 때문에 두 플랫폼에 동일하게 사용될 수 있는 버전을 관리 방법을 찾아야 한다.
플레이 콘솔 앱 출시 버전 정책
플러터에서는 앱 버전을 설정하기 위해서 pubspec.yaml 파일을 사용한다. 파일의 상단에 version이라고 적혀있는 부분이 있는데 그곳에 앱이 어떤 버전으로 빌드될 것인지 적어주기만 하면 된다.
플러터에서 버전 스트링은 총 4가지로 나뉘며 본인은 각각 아래와 같이 부르고 있다.
1(major) . 6(minor) . 0(maintain) + 27(version code)
앞의 1.6.0 부분은 누구나 잘 알꺼라고 생각하지만 그것보다 중요한 부분은 바로 + 다음에 적어주는 27(version code)이다.
안드로이드 앱은 플레이 콘솔에서 앱을 출시할 때, 버전 이름(1.6.0)과 버전 코드(27)를 확인한다. 버전 이름같은 경우에는 크게 신경쓰지 않지만 버전 코드같은 경우에는 다르다. 만약 과거 앱 출시 이력에 현재 출시하려는 버전 코드가 존재한다면 앱은 출시할 수 없다. 즉, 앱을 업데이트할수록 버전코드는 계속해서 증가하게 된다.
예를 들어 업데이트를 100번 진행한 앱이 있다고 가정해보자. 앱의 버전은 3.2.4 + 100 와 같은 형태일 것이다. 이처럼 버전 코드는 계속 증가하게 된다. 이러면 버전 코드가 10000가 될 수도 있지 않냐? 라고 생각할 수 있다. 맞다. 10000까지 갈 수 있으며 플레이 콘솔에서는 버전 코드의 최대 값으로 2100000000까지 지원한다고 설명하고 있다.
반면에 IOS같은 경우 앱을 출시할 때, 버전 코드를 포함시켜도 되고 앱 버전으로만 출시해도 되서 버전 관리가 깔끔하게 이루어진다. 하지만 우리는 IOS 앱이던 Android 앱이던 pubspec.yaml 파일로 버전을 관리해주기 때문에 결국엔 IOS 앱도 버전 코드를 사용해야한다.
버전 관리
그렇다면 안드로이드의 경우에만 버전 코드가 사용되도록 따로 설정해줄 수는 없을까? 이 문제를 해결하기 위해 안드로이드 앱에 버전이 어떤식으로 적용되는지 확인해본다.
안드로이드 앱 같은 경우에는 빌드가 될 때, 버전에 대한 정보가 /android/app/build.gradle 파일 defaultConfig에 versionCode, versionName 이라는 변수로 전달되고 앱에 매핑이 된다.
이 변수에 전달되는 값은 찾아보면 /android/local.properties 파일에 적혀있다.
그러면 이 값을 바꾸면 안드로이드 앱의 버전도 바뀌냐고 생각할 수 있는데, 처음에 말했듯이 플러터 앱의 버전은 pubspec.yaml 파일에서 관리하기 때문에 local.properties를 직접 바꿔도 pubspec.yaml 파일에 설정한 값으로 돌아온다.
결론
결론적으로 플러터로 ios, android 앱을 개발한다면 어쩔 수 없이 버전코드를 사용해야 한다. ios의 경우 버전 이름만으로도 앱의 버전을 관리할 수 있지만 안드로이드의 경우 그것이 안되기 때문에 어쩔 수 없이 ios도 버전 코드를 사용해서 버전을 관리해주어야 한다.