Jetpack — 정의, 아키텍처 구성 요소

저자: IT Sectr 게시일: 2026-05-01 읽는 시간: 9 분

Jetpack은 개발을 간소화하고 안정적인 애플리케이션 생성을 가속화하는 Google의 Android 라이브러리 세트입니다. ViewModel, Room, Navigation과 같은 구성 요소는 수명 주기 관리, 데이터 저장 및 탐색과 같은 일반적인 작업을 해결합니다. Android Developers (2026)에 따르면 Jetpack은 50개 이상의 라이브러리를涵盖하며, 각 라이브러리는 AndroidX(Support Library를 대체한 호환성 라이브러리)를 통해 Android 5.0(API 21)과 하위 호환됩니다.

핵심 요점

  • Android Jetpack — 50개 이상의 라이브러리 세트로, AndroidX를 통해 하위 호환성을 보장하며 Android 앱 개발을 가속화합니다.
  • ViewModel은 화면 회전을 견디고 Activity 재생성 시 데이터를 보존하여 사용자 입력 손실을 방지합니다.
  • Room — SQLite 위의 ORM 계층으로, 컴파일 타임 SQL 쿼리 검증 및 코루틴 지원을 제공합니다.
  • Navigation Component는 타입 안전 인수를 사용하는 탐색 그래프를 통해 화면 간 전환을 관리합니다.
  • Lifecycle은 컨트롤러에서 boilerplate 코드 없이 Activity/Fragment 수명 주기 이벤트에 반응할 수 있게 합니다.

Android Jetpack이란?

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). 각 범주는 데이터 관리부터 사용자 인터페이스까지 애플리케이션의 특정 계층 작업을 처리합니다.

Jetpack 철학

Google은 세 가지 Jetpack 원칙을提倡합니다: accelerate development(boilerplate 감소, 비즈니스 로직 증가), eliminate boilerplate(ViewModel은 수동 상태 저장 제거, Room은 SQLiteOpenHelper 작성 제거), build with confidence(각 라이브러리는 출시 전 15,000개 이상의 테스트 통과). Android Developers (2026)에 따르면 Jetpack을 사용하는 앱은 수명 주기 관련 충돌이 30% 적습니다.

기반으로서의 AndroidX

모든 Jetpack 라이브러리는 AndroidX 식별자(androidx.*와 같은 아티팩트)로 배포됩니다. AndroidX는 Support Library(com.android.support.*와 같은 아티팩트)를 대체하여 모놀리식 라이브러리를 독립적 버전 관리가 있는 모듈식 아티팩트로 분할했습니다. AndroidX로의 마이그레이션은 gradle.properties에서 android.useAndroidX=true 옵션을 통해 수행되며, Android Studio가 자동으로 임포트를 변환합니다.

아키텍처 구성 요소: ViewModel, Lifecycle, LiveData

ViewModel은 UI 데이터를 저장하는 Jetpack 아키텍처의 핵심 구성 요소입니다. 화면 회전 시 소멸되는 Activity와 달리 ViewModel은 메모리에 유지됩니다. 사용자가 양식을 작성하고, 전화기를 회전해도 데이터는 손실되지 않습니다. ViewModel은 LifecycleOwner(Activity 또는 Fragment)가 영구적으로 수명 주기를 종료(finish)할 때 자동으로 정리됩니다.

kotlin
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 및 코루틴

viewModelScope — ViewModel 수명 주기에 연결된 기본 제공 CoroutineScope입니다. 이 범위에서 시작된 모든 코루틴은 ViewModel이 정리될 때 자동으로 취소됩니다. 이는 각 ViewModel에서 Disposable 및 CompositeDisposable의 수동 관리를 제거합니다. viewModelScope를 사용하려면 androidx.lifecycle:lifecycle-viewmodel-ktx 종속성이 필요합니다.

Room: Android에서 데이터베이스 작업

Room은 SQLite 위에 추상 계층을 제공하는 Jetpack ORM 라이브러리입니다. 원시 SQL 쿼리를 작성하고 Cursor를 수동으로 객체로 변환하는 대신, 개발자는 Entity(테이블), DAO(Data Access Object) 및 Database(진입점)를 선언합니다. Room은 @Query 어노테이션을 통해 컴파일 타임에 SQL 쿼리를 검증합니다. 테이블이나 컬럼이 존재하지 않으면 명확한 오류와 함께 빌드가 실패합니다.

kotlin
@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을 발생시켜 스키마 업데이트 시 우발적인 데이터 손실로부터 프로젝트를 보호합니다.

TypeConverters 및 관계

Room은 기본 타입과 그 래퍼만 저장합니다. 목록, Date 또는 사용자 정의 객체를 저장하려면 @TypeConverter — 타입을 String(JSON) 또는 Long(timestamp)으로 변환하는 정적 메서드를 사용합니다. 테이블 간 관계는 @Relation 어노테이션이 있는 중첩 객체와 효율적인 join 쿼리를 위한 @Transaction이 있는 도우미 POJO 클래스를 통해 모델링됩니다.

Navigation Component — 화면 간 전환을 관리하는 Jetpack 라이브러리입니다. 수동으로 FragmentTransaction을 호출하는 대신, 개발자는 탐색 그래프(대상 노드가 있는 XML 파일)를 생성하고 시스템은 타입 안전 전환 메서드가 있는 Directions 클래스를 생성합니다. Navigation Component는 백 스택, 딥 링크 및 화면 간 인수 전달을 올바르게 처리합니다.

kotlin
// 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

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%를覆盖합니다.

주요 AndroidX 아티팩트

가장 자주 사용되는 아티팩트: appcompat(어두운 테마, 오래된 API의 Material Design), recyclerview(ViewHolder가 있는 적응형 목록), constraintlayout(플랫 계층 구조의 유연한 컨테이너), cardview(Material Design 카드), preference(Material 스타일의 설정 화면). 각 아티팩트는 독립적으로 버전 관리되어 전체 패키지를 업데이트하지 않고도 수정 사항을 신속하게 제공할 수 있습니다.

기타 중요한 Jetpack 라이브러리

Architecture 및 AndroidX 외에도 Jetpack에는 일반적인 모바일 개발 작업을 위한 많은 특수 라이브러리가 포함되어 있습니다. WorkManager — 실행이 보장된 백그라운드 작업(동기화, 로그 업로드)을 위한 라이브러리로, 정기 및 지연 작업과 네트워크 및 배터리 제약 조건을 지원합니다. DataStore — 코루틴 기반 SharedPreferences의 대체재로, 타입화된 속성(Preferences DataStore) 및 Protocol Buffers(Proto DataStore)를 지원합니다.

  • Hilt — @HiltViewModel, @Inject, @Module 어노테이션을 통해 의존성 주입을 간소화하는 Dagger 기반 DI 프레임워크입니다. ViewModel 및 Navigation과의 기본 제공 통합.
  • Paging 3 — RemoteMediator(네트워크 + 캐시), StateFlow 및 Compose를 지원하는 네트워크/DB에서 페이지별 데이터 로딩 라이브러리.
  • CameraX — 통합 CameraController 인터페이스를 통해 제조업체 차이(Samsung, Xiaomi, Honor)를 추상화하는 카메라 작업 API.
  • Security Crypto — Android Keystore의 마스터 키로 AES-256 기반 EncryptedSharedPreferences 및 EncryptedFile을 통한 데이터 암호화.

각 라이브러리에는 자체 최소 SDK 및 아티팩트가 있습니다. Google은 1년에 한 번(Android 릴리스와 동시에) 주요 버전을 출시하고 분기별로 보안 패치를 출시합니다. 권장 사항 — APK 크기 증가를 피하기 위해 필요한 라이브러리만 포함하세요. 전체 Jetpack 컬렉션(모든 아티팩트)은 20MB 이상이지만 일반적인 앱은 5~7개의 라이브러리를 사용하여 APK에 3~5MB를 추가합니다.

자주 묻는 질문

Support Library에서 AndroidX로 마이그레이션해야 하나요?

네, Google은 2019년에 Support Library 지원을 중단했습니다. 모든 새 Jetpack 라이브러리 및 Google Play Services에는 AndroidX가 필요합니다. 마이그레이션은 Android Studio를 통해 30~60분이 소요됩니다.

Jetpack은 Java에서 사용할 수 있나요, 아니면 Kotlin에서만 가능한가요?

Jetpack은 Java와 완전히 호환됩니다. 그러나 많은 기능(viewModelScope, 코루틴, Compose)은 Kotlin에서만 사용할 수 있습니다. Google은 새 프로젝트에 Kotlin을 권장합니다.

ViewModel과 onSaveInstanceState의 차이점은?

ViewModel은 메모리에 객체를 저장하고 회전을 견딥니다. onSaveInstanceState는 직렬화 가능한 기본 타입(Bundle)에만 적합합니다. ViewModel은 프로세스 종료 시 보존되지 않으며 이를 위해 SavedStateHandle이 필요합니다.

코루틴 대신 WorkManager를 사용해야 하는 경우는?

WorkManager — 앱이 종료된 후에도 실행되어야 하는 작업(동기화, 로그 업로드, 분석 전송)용. 코루틴 — 화면에 연결된 작업용.

SharedPreferences에서 DataStore로 마이그레이션하는 방법은?

SharedPreferences 임포트를 DataStore로 바꾸세요. dataStore.data.first()(suspend)로 읽고 dataStore.edit { ... }로 씁니다. DataStore는 비동기식이며 ANR로부터 보호됩니다.

요약

  • Android Jetpack — API 21까지 하위 호환되는 AndroidX 아래 통합된 50개 이상의 Android 개발 라이브러리 세트.
  • ViewModel은 화면 회전을 견디고 UI 데이터를 보존하며, Lifecycle은 Activity/Fragment 상태 변경을 구성 요소에 알립니다.
  • Room — 컴파일 타임 쿼리 검증, 마이그레이션 및 코루틴 지원을 갖춘 SQLite 위의 타입 안전 ORM.
  • Navigation Component는 타입 안전 인수 및 자동 딥 링크를 사용하는 그래프를 통해 전환을 관리합니다.
  • WorkManager는 앱 종료 후에도 백그라운드 작업 실행을 보장하고 DataStore는 SharedPreferences를 대체합니다.
  • Jetpack은 Architecture, UI, Behavior, Foundation의 네 가지 범주로 나뉘며 각각 고유한 애플리케이션 계층을 담당합니다.
  • Jetpack을 사용하는 앱은 수명 주기 관련 충돌이 30% 적고 기성 아키텍처 솔루션 덕분에 더 빠르게 개발됩니다.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기