내 앱 버전 확인하기: Android에서 versionCode와 versionName 가져오기

안드로이드 앱을 개발하고 운영하다 보면, 현재 설치된 내 앱의 버전 정보가 필요한 순간들이 있습니다. 예를 들어, 사용자에게 새로운 버전이 나왔으니 업데이트하라고 안내를 띄우거나, ‘설정’ 또는 ‘앱 정보’ 화면에 현재 버전을 표시해 주거나, 혹은 버그 리포팅 시 앱 버전을 함께 기록하여 분석을 용이하게 할 때 등 다양한 상황에서 활용되죠.

오늘은 안드로이드 앱에서 자신의 버전 정보, 즉 versionCodeversionName을 가져오는 간단하고 확실한 방법을 알아보고, 두 버전 값의 중요한 차이점에 대해서도 명확하게 짚어보겠습니다.

versionCodeversionName, 무엇이 다른가요?

코드를 살펴보기 전에, 안드로이드의 두 가지 버전 체계에 대해 이해하는 것이 중요합니다. 이 둘은 각기 다른 목적을 가지고 있습니다.

versionCode – 기계를 위한 버전 (내부 관리용)

양의 정수(Integer) 값으로, 앱의 버전을 내부적으로 구분하기 위해 사용됩니다. 주로 구글 플레이 스토어가 업데이트 여부를 판단하는 기준이 됩니다. 새로운 버전의 APK를 스토어에 업로드할 때는 반드시 이전 versionCode보다 높은 정수값을 사용해야 합니다. 사용자에게는 직접 노출되지 않습니다. 오직 개발자와 플레이 스토어만 이 숫자를 보고 버전을 구분합니다. 값은 항상 1, 2, 3, … 과 같이 증가해야 합니다.

versionName – 사람을 위한 버전 (사용자 표시용)

문자열(String) 값으로, 사용자에게 보여주기 위한 버전 이름입니다. 사용자가 “아, 내 앱이 지금 이 버전이구나”라고 인지할 수 있도록 하는 것이 주된 목적입니다. 플레이 스토어의 앱 상세 페이지나 앱 내부의 ‘정보’ 화면에 표시됩니다. “1.0”, “1.2.1-beta”, “2025 June Update” 등 개발자가 원하는 형식으로 자유롭게 지정할 수 있습니다. versionCode와는 달리 반드시 숫자로 구성되거나 증가할 필요는 없습니다.

어디서 설정할까요?

이 두 값은 보통 모듈 수준의 build.gradle 또는 build.gradle.kts 파일 안에서 설정합니다.

// app/build.gradle (Groovy)
android {
    defaultConfig {
        ...
        versionCode 1       
        // 기계가 인식하는 버전 (정수)
        versionName "1.0"   
        // 사용자가 보는 버전 (문자열)
    }
    ...
}

앱 버전 정보 가져오기 (Kotlin/Java 코드)

이제 실제로 코드에서 앱의 버전 정보를 가져오는 방법을 알아보겠습니다. PackageManager를 이용하면 아주 간단하게 확인할 수 있습니다.

Kotlin 코드 예시

import android.content.Context
import android.content.pm.PackageInfo
import android.content.pm.PackageManager

fun getAppVersion(context: Context): Pair<Int, String> {
    return try {
        // 현재 앱의 패키지 정보를 가져옵니다.
        val packageInfo: PackageInfo = context.packageManager.getPackageInfo(context.packageName, 0)
        
        // versionCode와 versionName을 Pair 형태로 반환합니다.
        Pair(packageInfo.versionCode, packageInfo.versionName)
    } catch (e: PackageManager.NameNotFoundException) {
        // 이 예외는 이론적으로 발생하기 어렵습니다. (자기 자신의 패키지를 못 찾는 경우)
        e.printStackTrace()
        Pair(-1, "N/A")
    }
}

// 사용 예시
// val (versionCode, versionName) = getAppVersion(this)
// Log.d("AppVersion", "Version Code: $versionCode, Version Name: $versionName")

Java 코드 예시

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;

public class AppVersionUtils {
    public static String getVersionName(Context context) {
        try {
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            return packageInfo.versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            return "N/A";
        }
    }

    public static int getVersionCode(Context context) {
        try {
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            return packageInfo.versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            return -1;
        }
    }
}

// 사용 예시
// int versionCode = AppVersionUtils.getVersionCode(this);
// String versionName = AppVersionUtils.getVersionName(this);
// Log.d("AppVersion", "Version Code: " + versionCode + ", Version Name: " + versionName);

코드에서 볼 수 있듯이, context.getPackageManager().getPackageInfo() 메소드를 통해 현재 앱의 PackageInfo 객체를 얻어오고, 이 객체에서 versionCodeversionName 프로퍼티를 직접 읽어오면 됩니다. PackageManager.NameNotFoundException에 대한 try-catch 처리는 필수입니다.

Android 13 (API 33) 이상에서의 더 나은 방법

안드로이드 13(Tiramisu, API 33)부터는 getPackageInfo 메소드의 두 번째 인자로 flags를 전달하는 방식이 새롭게 도입되었습니다. 이 방식을 사용하면 코드가 조금 더 명확해지고, 더 이상 NameNotFoundExceptiontry-catch로 처리할 필요가 없어집니다.

import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import androidx.annotation.RequiresApi

@RequiresApi(Build.VERSION_CODES.TIRAMISU)
fun getAppVersionTiramisu(context: Context): Pair<Long, String> {
    // 두 번째 인자로 PackageInfoFlags 객체를 전달합니다.
    val packageInfo = context.packageManager.getPackageInfo(
        context.packageName,
        PackageManager.PackageInfoFlags.of(0)
    )
    
    // API 33부터는 longVersionCode를 사용하는 것이 권장됩니다.
    // 기존 int 타입의 versionCode는 21억 이상의 값을 표현할 수 없기 때문입니다.
    return Pair(packageInfo.longVersionCode, packageInfo.versionName)
}

longVersionCode는 기존 versionCode가 표현할 수 있는 정수 범위를 넘어설 경우를 대비해 도입된 Long 타입의 버전 코드입니다. 최신 앱에서는 이 값을 기준으로 작업하는 것이 더 안전합니다.

마치며

오늘은 안드로이드 앱에서 자신의 versionCodeversionName을 가져오는 방법에 대해 알아보았습니다.

  • versionCode는 플레이 스토어와 앱 내부 로직을 위한 내부 관리용 정수.
  • versionName은 사용자와의 소통을 위한 표시용 문자열.

이 두 가지의 차이점을 명확히 이해하고, 오늘 배운 코드를 활용하여 여러분의 앱에 ‘버전 정보 표시’나 ‘업데이트 확인’과 같은 필수적인 기능들을 구현해 보세요. 작지만 중요한 디테일이 앱의 완성도와 사용자 경험을 한 단계 끌어올려 줄 것입니다.

읽어주셔서 감사합니다. 🙂

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤