Jetpack은 개발을 간소화하고 안정적인 애플리케이션 생성을 가속화하는 Google의 Android 라이브러리 세트입니다. ViewModel, Room, Navigation과 같은 구성 요소는 수명 주기 관리, 데이터 저장 및 탐색과 같은 일반적인 작업을 해결합니다. Android Developers (2026)에 따르면 Jetpack은 50개 이상의 라이브러리를涵盖하며, 각 라이브러리는 AndroidX(Support Library를 대체한 호환성 라이브러리)를 통해 Android 5.0(API 21)과 하위 호환됩니다.
핵심 요점
Android Jetpack은 2018년 Google I/O에서 발표된 Google의 라이브러리, 도구 및 아키텍처 지침 모음입니다. Jetpack은 Support Library와 Android Architecture Components를 대체하여 단일 생태계로 통합했습니다. Jetpack 이전에는 각 Android 라이브러리가 독립적으로 업데이트되어 버전 충돌이 발생했습니다. Jetpack은 단일 AndroidX 식별자로 버전을 동기화하고 부수적 패치가 포함된 안정적인 주요 버전 모델을 도입했습니다.
Jetpack 라이브러리는 네 가지 범주로 나뉩니다: Architecture(ViewModel, Room, Navigation, WorkManager), UI(Fragment, Compose, Animation, Palette), Behavior(DownloadManager, Media, Permissions, Sharing), Foundation(Android KTX, Multidex, AppCompat). 각 범주는 데이터 관리부터 사용자 인터페이스까지 애플리케이션의 특정 계층 작업을 처리합니다.
Google은 세 가지 Jetpack 원칙을提倡합니다: accelerate development(boilerplate 감소, 비즈니스 로직 증가), eliminate boilerplate(ViewModel은 수동 상태 저장 제거, Room은 SQLiteOpenHelper 작성 제거), build with confidence(각 라이브러리는 출시 전 15,000개 이상의 테스트 통과). Android Developers (2026)에 따르면 Jetpack을 사용하는 앱은 수명 주기 관련 충돌이 30% 적습니다.
모든 Jetpack 라이브러리는 AndroidX 식별자(androidx.*와 같은 아티팩트)로 배포됩니다. AndroidX는 Support Library(com.android.support.*와 같은 아티팩트)를 대체하여 모놀리식 라이브러리를 독립적 버전 관리가 있는 모듈식 아티팩트로 분할했습니다. AndroidX로의 마이그레이션은 gradle.properties에서 android.useAndroidX=true 옵션을 통해 수행되며, Android Studio가 자동으로 임포트를 변환합니다.
ViewModel은 UI 데이터를 저장하는 Jetpack 아키텍처의 핵심 구성 요소입니다. 화면 회전 시 소멸되는 Activity와 달리 ViewModel은 메모리에 유지됩니다. 사용자가 양식을 작성하고, 전화기를 회전해도 데이터는 손실되지 않습니다. ViewModel은 LifecycleOwner(Activity 또는 Fragment)가 영구적으로 수명 주기를 종료(finish)할 때 자동으로 정리됩니다.
class ProfileViewModel : ViewModel() {
private val _userName = MutableLiveData<String>()
val userName: LiveData<String> = _userName
fun loadProfile(userId: String) {
viewModelScope.launch {
val user = repository.getUser(userId)
_userName.value = user.name
}
}
}
@OptIn(ExperimentalLifecycleApi::class)
class MyObserver : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart() {
println("화면 시작됨")
}
}
LiveData — 수명 주기를 존중하는 관찰 가능한 데이터 컨테이너입니다. 화면이 보이지 않으면(onStop) LiveData는 업데이트를 보내지 않아 메모리 누수와 존재하지 않는 Activity 업데이트 시도 시 충돌을 방지합니다. Lifecycle — 현재 상태(CREATED, STARTED, RESUMED)를 저장하고 다른 구성 요소가 상태 변경을 구독할 수 있게 하는 클래스입니다. ViewModel, LiveData 및 Lifecycle은 함께 반응형 Android 아키텍처의 기초를 형성합니다.
viewModelScope — ViewModel 수명 주기에 연결된 기본 제공 CoroutineScope입니다. 이 범위에서 시작된 모든 코루틴은 ViewModel이 정리될 때 자동으로 취소됩니다. 이는 각 ViewModel에서 Disposable 및 CompositeDisposable의 수동 관리를 제거합니다. viewModelScope를 사용하려면 androidx.lifecycle:lifecycle-viewmodel-ktx 종속성이 필요합니다.
Room은 SQLite 위에 추상 계층을 제공하는 Jetpack ORM 라이브러리입니다. 원시 SQL 쿼리를 작성하고 Cursor를 수동으로 객체로 변환하는 대신, 개발자는 Entity(테이블), DAO(Data Access Object) 및 Database(진입점)를 선언합니다. Room은 @Query 어노테이션을 통해 컴파일 타임에 SQL 쿼리를 검증합니다. 테이블이나 컬럼이 존재하지 않으면 명확한 오류와 함께 빌드가 실패합니다.
@Entity
data class User(
@PrimaryKey val id: String,
val name: String,
val email: String
)
@Dao
interface UserDao {
@Query("SELECT * FROM User WHERE id = :userId")
suspend fun getUser(userId: String): User?
@Insert
suspend fun insertUser(user: User)
}
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
Entity User는 세 개의 컬럼이 있는 테이블을 설명합니다. DAO는 코루틴 작업을 위한 suspend 함수를 선언하며, 쿼리는 자동으로 백그라운드 스레드에서 실행됩니다. Room은 @Migration 어노테이션을 통한 마이그레이션을 지원합니다. 개발자는 버전 간 전환을 위한 SQL 스크립트를 설명하고 Room은 데이터 손실 없이 실행합니다. 마이그레이션이 없으면 Room은 IllegalStateException을 발생시켜 스키마 업데이트 시 우발적인 데이터 손실로부터 프로젝트를 보호합니다.
Room은 기본 타입과 그 래퍼만 저장합니다. 목록, Date 또는 사용자 정의 객체를 저장하려면 @TypeConverter — 타입을 String(JSON) 또는 Long(timestamp)으로 변환하는 정적 메서드를 사용합니다. 테이블 간 관계는 @Relation 어노테이션이 있는 중첩 객체와 효율적인 join 쿼리를 위한 @Transaction이 있는 도우미 POJO 클래스를 통해 모델링됩니다.
Navigation Component — 화면 간 전환을 관리하는 Jetpack 라이브러리입니다. 수동으로 FragmentTransaction을 호출하는 대신, 개발자는 탐색 그래프(대상 노드가 있는 XML 파일)를 생성하고 시스템은 타입 안전 전환 메서드가 있는 Directions 클래스를 생성합니다. Navigation Component는 백 스택, 딥 링크 및 화면 간 인수 전달을 올바르게 처리합니다.
// nav_graph.xml
//
// android:name=".ProfileFragment">
//
// android:defaultValue="-1"
// app:argType="integer" />
//
// 프래그먼트 코드에서:
class ProfileFragment : Fragment() {
private val args: ProfileFragmentArgs by navArgs()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
loadProfile(args.userId)
}
}
userId 인수는 타입 지정(integer) 및 기본값과 함께 탐색 그래프에서 전달됩니다. ProfileFragmentArgs 클래스는 Navigation Safe Args 플러그인에 의해 자동으로 생성되며, 올바른 Kotlin 타입의 모든 인수를 포함합니다. 딥 링크는 그래프에서 구성됩니다: app:deepLink="app://profile/{userId}". Navigation Component가 URL을解析하고 사용자가 인터페이스를 통해 탐색한 것처럼 백 스택을 생성합니다.
Navigation Component는 NavController를 통해 BottomNavigationView와 통합됩니다. 각 메뉴 항목은 그래프의 대상에 연결됩니다. 탭 간 전환은 프래그먼트를 다시 생성하지 않으며, Navigation Component는 NavBackStackEntry를 통해 상태를 보존합니다. 조건부 탐색(인증되지 않은 경우 로그인 표시)의 경우 onCreate에서 확인과 함께 navController.navigate(condition)이 사용됩니다.
AndroidX는 각 라이브러리가 독립적 버전의 자체 아티팩트를 갖도록 재설계된 Support Library 아키텍처입니다. 단일 com.android.support:appcompat-v7:28.0.0 대신 AndroidX는 androidx.appcompat:appcompat:1.7.0, androidx.recyclerview:recyclerview:1.4.0 등을 제공합니다. 이는 서로 다른 종속성이 Support Library의 다른 버전을 가져와 충돌을 일으키는 문제를 제거했습니다.
AndroidX로의 마이그레이션은 Android Studio 3.2+에서 Refactor → Migrate to AndroidX 메뉴를 통해 자동으로 수행됩니다. Studio는 Java/Kotlin 파일, 매니페스트 및 리소스의 모든 임포트를 대체합니다. 하위 호환성은 AndroidX의 주요 장점입니다. 라이브러리는 Android 5.0(API 21) 이상에서 작동하며 Google Play Console (2025)에 따르면 활성 기기의 97%를覆盖합니다.
가장 자주 사용되는 아티팩트: appcompat(어두운 테마, 오래된 API의 Material Design), recyclerview(ViewHolder가 있는 적응형 목록), constraintlayout(플랫 계층 구조의 유연한 컨테이너), cardview(Material Design 카드), preference(Material 스타일의 설정 화면). 각 아티팩트는 독립적으로 버전 관리되어 전체 패키지를 업데이트하지 않고도 수정 사항을 신속하게 제공할 수 있습니다.
Architecture 및 AndroidX 외에도 Jetpack에는 일반적인 모바일 개발 작업을 위한 많은 특수 라이브러리가 포함되어 있습니다. WorkManager — 실행이 보장된 백그라운드 작업(동기화, 로그 업로드)을 위한 라이브러리로, 정기 및 지연 작업과 네트워크 및 배터리 제약 조건을 지원합니다. DataStore — 코루틴 기반 SharedPreferences의 대체재로, 타입화된 속성(Preferences DataStore) 및 Protocol Buffers(Proto DataStore)를 지원합니다.
각 라이브러리에는 자체 최소 SDK 및 아티팩트가 있습니다. Google은 1년에 한 번(Android 릴리스와 동시에) 주요 버전을 출시하고 분기별로 보안 패치를 출시합니다. 권장 사항 — APK 크기 증가를 피하기 위해 필요한 라이브러리만 포함하세요. 전체 Jetpack 컬렉션(모든 아티팩트)은 20MB 이상이지만 일반적인 앱은 5~7개의 라이브러리를 사용하여 APK에 3~5MB를 추가합니다.
자주 묻는 질문
네, Google은 2019년에 Support Library 지원을 중단했습니다. 모든 새 Jetpack 라이브러리 및 Google Play Services에는 AndroidX가 필요합니다. 마이그레이션은 Android Studio를 통해 30~60분이 소요됩니다.
Jetpack은 Java와 완전히 호환됩니다. 그러나 많은 기능(viewModelScope, 코루틴, Compose)은 Kotlin에서만 사용할 수 있습니다. Google은 새 프로젝트에 Kotlin을 권장합니다.
ViewModel은 메모리에 객체를 저장하고 회전을 견딥니다. onSaveInstanceState는 직렬화 가능한 기본 타입(Bundle)에만 적합합니다. ViewModel은 프로세스 종료 시 보존되지 않으며 이를 위해 SavedStateHandle이 필요합니다.
WorkManager — 앱이 종료된 후에도 실행되어야 하는 작업(동기화, 로그 업로드, 분석 전송)용. 코루틴 — 화면에 연결된 작업용.
SharedPreferences 임포트를 DataStoredataStore.data.first()(suspend)로 읽고 dataStore.edit { ... }로 씁니다. DataStore는 비동기식이며 ANR로부터 보호됩니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.