-
ViewModel이란 무엇인가?
-
lifecycle은 무엇일까?
-
즉, ViewModel은 View의 Lifecycle 동안 데이터를 유지시켜 주는 클래스이다.
-
ViewModel은 왜 사용할까? (MVVM)
-
ViewModel 요청 프로세스
-
ViewModel을 생성하려면 ViewModelProvider 객체가 필요하다.
-
ViewModelStoreOwner (ViewModel 생명주기 관리)
-
ViewModelProvider.Factory (ViewModel 생성 방식 지정)
-
AndroidViewModel과 AndroidViewModelFactory
-
ViewModelProvider과 by ViewModel()
-
ViewModelProvider이란
-
by viewModels() 는??
-
Lazy Initialization (지연 초기화)란?
-
by viewModels() 내부 동작 분석
-
LifeCycleOwner, ViewLifecycleOwner와 ViewModel 정리
-
LifeCycleOwner이란
-
ViewLifecycleOwner란?
-
왜 Fragment에서 ViewLifecycleOwner가 필요할까?
-
참고
ViewModel이란 무엇인가?
- ViewModel은 Android Architecture Component 중 하나로, UI 관련 데이터를 관리하고, 생명주기 변화(Activity/Fragment의 재생성)에도 데이터를 유지할 수 있도록 도와주는 클래스이다.
- ViewModel은 Life Cycle을 통해 Activity/Fragment의 수명주기를 인지하고 있다.
- Android의 MVVM(Model-View-ViewModel) 패턴에서 View와 Model 간의 중간 다리 역할을 한다.
- androidx.lifecycle.ViewModel 클래스를 상속받아 구현하며, 일반적으로 UI에서 필요한 데이터를 LiveData와 함께 사용하여 UI와 데이터를 독립적으로 관리할 수 있도록 돕는다.
@HiltViewModel
class LoginViewModel @Inject constructor(
isAuthReadyUseCase: IsAuthReadyUseCase,
getCurrentUserUseCase: GetCurrentUserUseCase,
private val loginUseCase: LoginUseCase
) : ViewModel() {
private val _uiState = MutableStateFlow(LoginUiState(onUpdate = ::update))
val uiState: StateFlow<LoginUiState> get() = _uiState.asStateFlow()
// ... (생략)
lifecycle은 무엇일까?

액티비티와 프래그먼트 같은 다른 구성요소의 수명 주기 상태 변경에 따라 작업을 실행한다. 이러한 구성요소를 사용하면 잘 구성된 경량의 코드를 만들고 더욱 쉽게 유지할 수 있다.
androidx.lifecycle 패키지는 수명 주기 인식 구성요소(액티비티나 프래그먼트의 현재 수명 주기 상태를 기반으로 동작을 자동 조정할 수 있는 구성요소)를 빌드할 수 있는 클래스 및 인터페이스를 제공한다.
Lifecycle은 액티비티나 프래그먼트와 같은 구성요소의 수명 주기 상태 관련 정보를 포함하며 다른 객체가 이 상태를 관찰할 수 있게 하는 클래스이다.
Lifecycle은 두 가지 기본 열거(이벤트, 상태)를 사용하여 연결된 구성요소의 수명 주기 상태를 추적한다.

쉽게 생각해서 요약하자면
즉, ViewModel은 View의 Lifecycle 동안 데이터를 유지시켜 주는 클래스이다.
어디서 본적이 있는 듯한 lifecycle과 viewModel의 활용(과거 내가 했던 것)
viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.uiState.collect {
updateUi(it, adapter)
}
}
}
- LifeCycle - Event
- 프레임워크 및 Lifecycle 클래스에서 전달되는 수명 주기 이벤트, 이러한 이벤트는 액티비티와 프래그먼트의 콜백 이벤트에 매핑된다.
- LifeCycle - State
- Lifecycle 객체가 추적한 구성요소(Activity/Fragement)의 현재 상태이다.
ViewModel은 왜 사용할까? (MVVM)
이미 위에서도 충분히 설명했지만 다시 정리해보자.
1. Activity/Fragment의 생명주기 문제
- Activity나 Fragment가 화면 회전(Configuration Change)하면 기존에 가지고 있던 데이터가 초기화 되는 문제가 발생한다.
- ViewModel을 사용하면 Activity/Fragment가 재생성되더라도 데이터를 유지할 수 있다.
2. 데이터 유지와 상태 관리
- ViewModel은 UI 상태를 지속적으로 유지하는 역할을 한다.
- ViewModel을 사용하지 않는다면, UI 상태를 onSaveInstanceState()에 저장해야 하지만, 번들(Bundle)의 크기 제한(1MB)으로 인해 큰 데이터를 저장하기 어렵다.
- ViewModel을 사용하면 네트워크 데이터, 로컬 데이터베이스, 계산된 값 등을 재사용할 수 있어 성능이 향상된다.

- ViewModel의 생명주기와 Activity의 관계
- Activity가 최초 생성될 때, 일반적으로 ViewModel도 함께 인스턴스화되어 생명주기를 함께 시작한다.
- ViewModel의 생명주기를 Fragment와 함께하도록 설정할 수도 있다.
- Configuration 변경과 ViewModel 유지
- 화면 회전과 같은 Configuration 변경이 발생하면 Activity는 다시 생성되지만, ViewModel은 메모리 상에 그대로 유지된다.
- 이는 Activity 내부에서 NonConfigurationInstances 객체를 별도로 관리하여, ViewModel이 Configuration 변경과 무관하게 유지되도록 하기 때문이다.
- Activity 종료 시 ViewModel의 소멸
- finish() 호출 등으로 인해 Activity의 생명주기가 종료되면, ViewModel도 함께 종료된다.
- 내부의 LifecycleEventObserver를 통해 ViewModel의 onCleared() 콜백 메서드가 호출되며, 리소스 해제 및 정리 작업이 이루어진다.



ViewModel 요청 프로세스

- ViewModelProvider를 통해 ViewModel 인스턴스를 요청한다.
- ViewModelProvider 내부에서는 ViewModelStoreOwner를 참조하여 ViewModelStore를 가져온다.
- ViewModelStore에게 이미 생성된(저장된) ViewModel 인스턴스를 요청한다.
- 만약 ViewModelStore가 적합한 ViewModel 인스턴스를 가지고 있지 않다면,
Factory를 통해 ViewModel인스턴스를 생성한다. - 생성한 ViewModel 인스턴스를 ViewModeStore에 저장하고 만들어진 ViewModel 인스턴스를 클라이언트에게 반환한다.
- 똑같은 ViewModel 인스턴스 요청이 들어온다면, 1~3번의 과정을 반복하게 된다.
ViewModel을 생성하려면 ViewModelProvider 객체가 필요하다.
- ViewModelProvider는 ViewModel을 생성하고 관리하는 역할을 수행.
- ViewModelProvider를 생성할 때 필요한 매개변수
- ViewModelStoreOwner (ViewModel을 저장하고 관리하는 객체)
- ViewModelProvider.Factory (ViewModel의 생성 방식 지정)
ViewModelStoreOwner (ViewModel 생명주기 관리)
- ComponentActivity와 Fragment는 ViewModelStoreOwner를 구현하고 있음.
- 즉, AppCompatActivity 또는 Fragment를 사용하면 별도로 ViewModelStoreOwner를 구현할 필요가 없음.
활용 방법
- Activity와 ViewModel을 함께 사용
val viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
this는 AppCompatActivity 또는 ComponentActivity.
- Fragment와 ViewModel을 함께 사용
val viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
this가 Fragment라면 Fragment의 생명주기와 함께 ViewModel이 유지됨.
- Fragment에서 Activity 범위의 ViewModel 사용
val viewModel = ViewModelProvider(requireActivity()).get(MainViewModel::class.java)
requireActivity()를 사용하면 Activity와 동일한 ViewModel을 공유 가능.
ViewModelProvider.Factory (ViewModel 생성 방식 지정)
- ViewModelProvider.Factory는 ViewModel을 커스텀 방식으로 생성할 때 사용.
- 기본적으로 매개변수가 없는 ViewModel이라면 NewInstanceFactory를 사용할 수 있음.
활용 방법
- 기본 ViewModel 인스턴스화 (매개변수 없는 경우)
val viewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(MainViewModel::class.java)
- 커스텀 ViewModelProvider.Factory 구현 (매개변수가 있는 ViewModel 생성)
class MyViewModelFactory(private val repository: MyRepository) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
return MyViewModel(repository) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
이후 ViewModel 생성 시 MyViewModelFactory를 사용해야 함
val factory = MyViewModelFactory(repository)
val viewModel = ViewModelProvider(this, factory).get(MyViewModel::class.java)
AndroidViewModel과 AndroidViewModelFactory
- AndroidViewModel은 Application 객체를 멤버로 가짐.
- Application Context를 필요로 하는 ViewModel의 경우 AndroidViewModel을 상속받아야 함.
- ViewModelProvider.AndroidViewModelFactory를 사용하여 생성.
활용 방법
class MyAndroidViewModel(application: Application) : AndroidViewModel(application) {
val context = getApplication<Application>().applicationContext
}
val viewModel = ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(application)).get(MyAndroidViewModel::class.java)
getApplication<Application>()을 사용해 Context 접근 가능.
ViewModelProvider과 by ViewModel()
ViewModelProvider이란
ViewModel을 생성하고 관리하는 클래스
- Android Jetpack의 ViewModel 라이브러리에서 제공하는 핵심 클래스.
- ViewModel 인스턴스를 LifecycleOwner(Activity, Fragment 등)에 맞게 관리하여, 화면 회전 등으로 인해 Activity가 재생성되더라도 ViewModel을 유지할 수 있도록 한다.
- ViewModelProvider는 ViewModel을 팩토리 패턴(Factory Pattern)을 사용하여 생성하고 제공하는 역할을 한다.
val viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
설명
- ViewModelProvider(this): 현재 Activity 또는 Fragment를 LifecycleOwner로 지정하여 ViewModel을 생성하고 관리.
- .get(MainViewModel::class.java): 해당 ViewModel의 인스턴스를 반환.
by viewModels() 는??
더 간결하고 효율적인 ViewModel 초기화 방식
- ViewModelProvider보다 더 간단한 문법으로 ViewModel을 사용할 수 있도록 함.
- Android Jetpack의 Kotlin 확장 함수(KTX)를 활용.
private val viewModel: MainViewModel by viewModels()
- by viewModels()는 내부적으로 Lazy 초기화를 사용하여 ViewModel을 필요할 때만 초기화.
- 불필요한 인스턴스 생성을 방지하고, 성능을 최적화
그렇다면 Lazy 초기화와 by lazy에 대해서 간단하게 정리해보면
Lazy Initialization (지연 초기화)란?
- 어떤 값을 필요할 때까지 초기화하지 않고 미루는 기법.
- Kotlin에서는 by lazy 키워드를 사용해 지연 초기화를 적용할 수 있음.
Lazy 인터페이스 정의
/**
* Represents a value with lazy initialization.
*
* To create an instance of [Lazy] use the [lazy] function.
*/
public interface Lazy<out T> {
/**
* Gets the lazily initialized value of the current Lazy instance.
* Once the value was initialized it must not change during the rest of lifetime of this Lazy instance.
*/
public val value: T
/**
* Returns `true` if a value for this Lazy instance has been already initialized, and `false` otherwise.
*/
public fun isInitialized(): Boolean
}
- Lazy<T>: 제네릭 타입으로 값을 지연 초기화하는 인터페이스.
- value: 최초 접근 시 초기화되며, 이후에는 변경되지 않음.
- isInitialized(): 값이 초기화되었는지 여부를 확인하는 함수
by viewModels() 내부 동작 분석
- by viewModels()는 내부적으로 Lazy를 활용하여 ViewModel을 생성함.
- 즉, ViewModel은 최초 접근 시점까지 초기화를 미루고, 이후에는 동일한 인스턴스를 반환.
by viewModels() 내부 코드
@MainThread
public inline fun <reified VM : ViewModel> ComponentActivity.viewModels(
noinline extrasProducer: (() -> CreationExtras)? = null,
noinline factoryProducer: (() -> Factory)? = null
): Lazy<VM> {
val factoryPromise = factoryProducer ?: {
defaultViewModelProviderFactory
}
return ViewModelLazy(
VM::class,
{ viewModelStore },
factoryPromise,
{ extrasProducer?.invoke() ?: this.defaultViewModelCreationExtras }
)
}
- viewModels() 함수는 Lazy<VM> 타입을 반환.
- ViewModelLazy를 사용하여 ViewModel의 지연 초기화를 수행.
- factoryProducer를 통해 ViewModel의 생성 방식(팩토리 패턴)을 정의.
- viewModelStore를 활용하여 기존 ViewModel 인스턴스를 유지.
LifeCycleOwner, ViewLifecycleOwner와 ViewModel 정리
LifeCycleOwner이란
- LifeCycleOwner는 클래스가 LifeCycle을 가지고 있음을 나타내는 인터페이스.
- Fragment, AppCompatActivity 등의 클래스에서 Lifecycle을 추출하고 활용 가능.
- 맞춤형 애플리케이션 클래스에서도 LifecycleOwner를 직접 구현할 수 있음.

ViewLifecycleOwner란?
- Fragment의 View의 생명주기를 관리하는 LifeCycleOwner.
- viewLifecycleOwner를 사용하면 Fragment의 View가 소멸될 때 ViewModel의 옵저버도 자동으로 해제됨.
viewModel.liveData.observe(viewLifecycleOwner) { data ->
// UI 업데이트
}
- viewLifecycleOwner를 사용하면 View가 사라질 때 LiveData 관찰도 중단.
- View가 존재하는 동안만 LiveData를 구독하여 메모리 누수를 방지.

왜 Fragment에서 ViewLifecycleOwner가 필요할까?
Fragment의 Lifecycle과 View의 Lifecycle은 다름
- Fragment는 onDestroy() 호출 전까지 살아있을 수 있음.
- 하지만 Fragment 내부의 View는 더 짧은 생명주기를 가짐(onDestroyView()에서 소멸).
- Detached된 Fragment의 경우 View가 사라졌어도 Fragment는 계속 유지될 수 있음 → 메모리 누수 위험.
참고
ViewModel이란 무엇인가? ViewModel 초보를 위한 가이드
ViewModel이란?
charlezz.medium.com
https://velog.io/@changhee09/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-ViewModel
[안드로이드] ViewModel
안드로이드 - ViewModel
velog.io
8. 궁금했던 것들 3편 - ViewModel LifeCycle
이번엔 MVVM의 ViewModel에 관한 궁금증을 해결해 볼 예정이다. MVVM에 관한 사항은 해당 글에서 설명한 바가 있다. 잘 모른다면 한 번 읽어보는 것도 좋겠다. MVVM을 안드로이드 문서에서는 Clean Architec
velog.io
[Android] ViewModelProvider와 by viewModels에 대해.
안드로이드 개발을 할 때 viewmodel을 사용해 액티비티와 프래그먼트 같은 UI 컴포넌트의 수명주기와 연결하여 데이터를 보관하고 관리하도록 한다.다들 알다시피 viewmodel을 이용하면 화면에 대한
velog.io
'Android > Study' 카테고리의 다른 글
[Android] Retrofit의 내부구조와 동작 알아보기 (0) | 2025.03.26 |
---|---|
[Android] 코루틴 정리 feat. suspend 키워드까지 (0) | 2025.03.19 |
[Android] 인텐트(Intent) 및 인텐트 필터(Intent Filter) (0) | 2025.02.20 |
[Android] Jetpack Compose의 Recomposition 정리 (0) | 2025.02.20 |
[Android] Jetpack Compose 개념 및 XML과의 비교 (0) | 2025.02.20 |
ViewModel이란 무엇인가?
- ViewModel은 Android Architecture Component 중 하나로, UI 관련 데이터를 관리하고, 생명주기 변화(Activity/Fragment의 재생성)에도 데이터를 유지할 수 있도록 도와주는 클래스이다.
- ViewModel은 Life Cycle을 통해 Activity/Fragment의 수명주기를 인지하고 있다.
- Android의 MVVM(Model-View-ViewModel) 패턴에서 View와 Model 간의 중간 다리 역할을 한다.
- androidx.lifecycle.ViewModel 클래스를 상속받아 구현하며, 일반적으로 UI에서 필요한 데이터를 LiveData와 함께 사용하여 UI와 데이터를 독립적으로 관리할 수 있도록 돕는다.
@HiltViewModel
class LoginViewModel @Inject constructor(
isAuthReadyUseCase: IsAuthReadyUseCase,
getCurrentUserUseCase: GetCurrentUserUseCase,
private val loginUseCase: LoginUseCase
) : ViewModel() {
private val _uiState = MutableStateFlow(LoginUiState(onUpdate = ::update))
val uiState: StateFlow<LoginUiState> get() = _uiState.asStateFlow()
// ... (생략)
lifecycle은 무엇일까?

액티비티와 프래그먼트 같은 다른 구성요소의 수명 주기 상태 변경에 따라 작업을 실행한다. 이러한 구성요소를 사용하면 잘 구성된 경량의 코드를 만들고 더욱 쉽게 유지할 수 있다.
androidx.lifecycle 패키지는 수명 주기 인식 구성요소(액티비티나 프래그먼트의 현재 수명 주기 상태를 기반으로 동작을 자동 조정할 수 있는 구성요소)를 빌드할 수 있는 클래스 및 인터페이스를 제공한다.
Lifecycle은 액티비티나 프래그먼트와 같은 구성요소의 수명 주기 상태 관련 정보를 포함하며 다른 객체가 이 상태를 관찰할 수 있게 하는 클래스이다.
Lifecycle은 두 가지 기본 열거(이벤트, 상태)를 사용하여 연결된 구성요소의 수명 주기 상태를 추적한다.

쉽게 생각해서 요약하자면
즉, ViewModel은 View의 Lifecycle 동안 데이터를 유지시켜 주는 클래스이다.
어디서 본적이 있는 듯한 lifecycle과 viewModel의 활용(과거 내가 했던 것)
viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.uiState.collect {
updateUi(it, adapter)
}
}
}
- LifeCycle - Event
- 프레임워크 및 Lifecycle 클래스에서 전달되는 수명 주기 이벤트, 이러한 이벤트는 액티비티와 프래그먼트의 콜백 이벤트에 매핑된다.
- LifeCycle - State
- Lifecycle 객체가 추적한 구성요소(Activity/Fragement)의 현재 상태이다.
ViewModel은 왜 사용할까? (MVVM)
이미 위에서도 충분히 설명했지만 다시 정리해보자.
1. Activity/Fragment의 생명주기 문제
- Activity나 Fragment가 화면 회전(Configuration Change)하면 기존에 가지고 있던 데이터가 초기화 되는 문제가 발생한다.
- ViewModel을 사용하면 Activity/Fragment가 재생성되더라도 데이터를 유지할 수 있다.
2. 데이터 유지와 상태 관리
- ViewModel은 UI 상태를 지속적으로 유지하는 역할을 한다.
- ViewModel을 사용하지 않는다면, UI 상태를 onSaveInstanceState()에 저장해야 하지만, 번들(Bundle)의 크기 제한(1MB)으로 인해 큰 데이터를 저장하기 어렵다.
- ViewModel을 사용하면 네트워크 데이터, 로컬 데이터베이스, 계산된 값 등을 재사용할 수 있어 성능이 향상된다.

- ViewModel의 생명주기와 Activity의 관계
- Activity가 최초 생성될 때, 일반적으로 ViewModel도 함께 인스턴스화되어 생명주기를 함께 시작한다.
- ViewModel의 생명주기를 Fragment와 함께하도록 설정할 수도 있다.
- Configuration 변경과 ViewModel 유지
- 화면 회전과 같은 Configuration 변경이 발생하면 Activity는 다시 생성되지만, ViewModel은 메모리 상에 그대로 유지된다.
- 이는 Activity 내부에서 NonConfigurationInstances 객체를 별도로 관리하여, ViewModel이 Configuration 변경과 무관하게 유지되도록 하기 때문이다.
- Activity 종료 시 ViewModel의 소멸
- finish() 호출 등으로 인해 Activity의 생명주기가 종료되면, ViewModel도 함께 종료된다.
- 내부의 LifecycleEventObserver를 통해 ViewModel의 onCleared() 콜백 메서드가 호출되며, 리소스 해제 및 정리 작업이 이루어진다.



ViewModel 요청 프로세스

- ViewModelProvider를 통해 ViewModel 인스턴스를 요청한다.
- ViewModelProvider 내부에서는 ViewModelStoreOwner를 참조하여 ViewModelStore를 가져온다.
- ViewModelStore에게 이미 생성된(저장된) ViewModel 인스턴스를 요청한다.
- 만약 ViewModelStore가 적합한 ViewModel 인스턴스를 가지고 있지 않다면,
Factory를 통해 ViewModel인스턴스를 생성한다. - 생성한 ViewModel 인스턴스를 ViewModeStore에 저장하고 만들어진 ViewModel 인스턴스를 클라이언트에게 반환한다.
- 똑같은 ViewModel 인스턴스 요청이 들어온다면, 1~3번의 과정을 반복하게 된다.
ViewModel을 생성하려면 ViewModelProvider 객체가 필요하다.
- ViewModelProvider는 ViewModel을 생성하고 관리하는 역할을 수행.
- ViewModelProvider를 생성할 때 필요한 매개변수
- ViewModelStoreOwner (ViewModel을 저장하고 관리하는 객체)
- ViewModelProvider.Factory (ViewModel의 생성 방식 지정)
ViewModelStoreOwner (ViewModel 생명주기 관리)
- ComponentActivity와 Fragment는 ViewModelStoreOwner를 구현하고 있음.
- 즉, AppCompatActivity 또는 Fragment를 사용하면 별도로 ViewModelStoreOwner를 구현할 필요가 없음.
활용 방법
- Activity와 ViewModel을 함께 사용
val viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
this는 AppCompatActivity 또는 ComponentActivity.
- Fragment와 ViewModel을 함께 사용
val viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
this가 Fragment라면 Fragment의 생명주기와 함께 ViewModel이 유지됨.
- Fragment에서 Activity 범위의 ViewModel 사용
val viewModel = ViewModelProvider(requireActivity()).get(MainViewModel::class.java)
requireActivity()를 사용하면 Activity와 동일한 ViewModel을 공유 가능.
ViewModelProvider.Factory (ViewModel 생성 방식 지정)
- ViewModelProvider.Factory는 ViewModel을 커스텀 방식으로 생성할 때 사용.
- 기본적으로 매개변수가 없는 ViewModel이라면 NewInstanceFactory를 사용할 수 있음.
활용 방법
- 기본 ViewModel 인스턴스화 (매개변수 없는 경우)
val viewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(MainViewModel::class.java)
- 커스텀 ViewModelProvider.Factory 구현 (매개변수가 있는 ViewModel 생성)
class MyViewModelFactory(private val repository: MyRepository) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
return MyViewModel(repository) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
이후 ViewModel 생성 시 MyViewModelFactory를 사용해야 함
val factory = MyViewModelFactory(repository)
val viewModel = ViewModelProvider(this, factory).get(MyViewModel::class.java)
AndroidViewModel과 AndroidViewModelFactory
- AndroidViewModel은 Application 객체를 멤버로 가짐.
- Application Context를 필요로 하는 ViewModel의 경우 AndroidViewModel을 상속받아야 함.
- ViewModelProvider.AndroidViewModelFactory를 사용하여 생성.
활용 방법
class MyAndroidViewModel(application: Application) : AndroidViewModel(application) {
val context = getApplication<Application>().applicationContext
}
val viewModel = ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(application)).get(MyAndroidViewModel::class.java)
getApplication<Application>()을 사용해 Context 접근 가능.
ViewModelProvider과 by ViewModel()
ViewModelProvider이란
ViewModel을 생성하고 관리하는 클래스
- Android Jetpack의 ViewModel 라이브러리에서 제공하는 핵심 클래스.
- ViewModel 인스턴스를 LifecycleOwner(Activity, Fragment 등)에 맞게 관리하여, 화면 회전 등으로 인해 Activity가 재생성되더라도 ViewModel을 유지할 수 있도록 한다.
- ViewModelProvider는 ViewModel을 팩토리 패턴(Factory Pattern)을 사용하여 생성하고 제공하는 역할을 한다.
val viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
설명
- ViewModelProvider(this): 현재 Activity 또는 Fragment를 LifecycleOwner로 지정하여 ViewModel을 생성하고 관리.
- .get(MainViewModel::class.java): 해당 ViewModel의 인스턴스를 반환.
by viewModels() 는??
더 간결하고 효율적인 ViewModel 초기화 방식
- ViewModelProvider보다 더 간단한 문법으로 ViewModel을 사용할 수 있도록 함.
- Android Jetpack의 Kotlin 확장 함수(KTX)를 활용.
private val viewModel: MainViewModel by viewModels()
- by viewModels()는 내부적으로 Lazy 초기화를 사용하여 ViewModel을 필요할 때만 초기화.
- 불필요한 인스턴스 생성을 방지하고, 성능을 최적화
그렇다면 Lazy 초기화와 by lazy에 대해서 간단하게 정리해보면
Lazy Initialization (지연 초기화)란?
- 어떤 값을 필요할 때까지 초기화하지 않고 미루는 기법.
- Kotlin에서는 by lazy 키워드를 사용해 지연 초기화를 적용할 수 있음.
Lazy 인터페이스 정의
/**
* Represents a value with lazy initialization.
*
* To create an instance of [Lazy] use the [lazy] function.
*/
public interface Lazy<out T> {
/**
* Gets the lazily initialized value of the current Lazy instance.
* Once the value was initialized it must not change during the rest of lifetime of this Lazy instance.
*/
public val value: T
/**
* Returns `true` if a value for this Lazy instance has been already initialized, and `false` otherwise.
*/
public fun isInitialized(): Boolean
}
- Lazy<T>: 제네릭 타입으로 값을 지연 초기화하는 인터페이스.
- value: 최초 접근 시 초기화되며, 이후에는 변경되지 않음.
- isInitialized(): 값이 초기화되었는지 여부를 확인하는 함수
by viewModels() 내부 동작 분석
- by viewModels()는 내부적으로 Lazy를 활용하여 ViewModel을 생성함.
- 즉, ViewModel은 최초 접근 시점까지 초기화를 미루고, 이후에는 동일한 인스턴스를 반환.
by viewModels() 내부 코드
@MainThread
public inline fun <reified VM : ViewModel> ComponentActivity.viewModels(
noinline extrasProducer: (() -> CreationExtras)? = null,
noinline factoryProducer: (() -> Factory)? = null
): Lazy<VM> {
val factoryPromise = factoryProducer ?: {
defaultViewModelProviderFactory
}
return ViewModelLazy(
VM::class,
{ viewModelStore },
factoryPromise,
{ extrasProducer?.invoke() ?: this.defaultViewModelCreationExtras }
)
}
- viewModels() 함수는 Lazy<VM> 타입을 반환.
- ViewModelLazy를 사용하여 ViewModel의 지연 초기화를 수행.
- factoryProducer를 통해 ViewModel의 생성 방식(팩토리 패턴)을 정의.
- viewModelStore를 활용하여 기존 ViewModel 인스턴스를 유지.
LifeCycleOwner, ViewLifecycleOwner와 ViewModel 정리
LifeCycleOwner이란
- LifeCycleOwner는 클래스가 LifeCycle을 가지고 있음을 나타내는 인터페이스.
- Fragment, AppCompatActivity 등의 클래스에서 Lifecycle을 추출하고 활용 가능.
- 맞춤형 애플리케이션 클래스에서도 LifecycleOwner를 직접 구현할 수 있음.

ViewLifecycleOwner란?
- Fragment의 View의 생명주기를 관리하는 LifeCycleOwner.
- viewLifecycleOwner를 사용하면 Fragment의 View가 소멸될 때 ViewModel의 옵저버도 자동으로 해제됨.
viewModel.liveData.observe(viewLifecycleOwner) { data ->
// UI 업데이트
}
- viewLifecycleOwner를 사용하면 View가 사라질 때 LiveData 관찰도 중단.
- View가 존재하는 동안만 LiveData를 구독하여 메모리 누수를 방지.

왜 Fragment에서 ViewLifecycleOwner가 필요할까?
Fragment의 Lifecycle과 View의 Lifecycle은 다름
- Fragment는 onDestroy() 호출 전까지 살아있을 수 있음.
- 하지만 Fragment 내부의 View는 더 짧은 생명주기를 가짐(onDestroyView()에서 소멸).
- Detached된 Fragment의 경우 View가 사라졌어도 Fragment는 계속 유지될 수 있음 → 메모리 누수 위험.
참고
ViewModel이란 무엇인가? ViewModel 초보를 위한 가이드
ViewModel이란?
charlezz.medium.com
https://velog.io/@changhee09/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-ViewModel
[안드로이드] ViewModel
안드로이드 - ViewModel
velog.io
8. 궁금했던 것들 3편 - ViewModel LifeCycle
이번엔 MVVM의 ViewModel에 관한 궁금증을 해결해 볼 예정이다. MVVM에 관한 사항은 해당 글에서 설명한 바가 있다. 잘 모른다면 한 번 읽어보는 것도 좋겠다. MVVM을 안드로이드 문서에서는 Clean Architec
velog.io
[Android] ViewModelProvider와 by viewModels에 대해.
안드로이드 개발을 할 때 viewmodel을 사용해 액티비티와 프래그먼트 같은 UI 컴포넌트의 수명주기와 연결하여 데이터를 보관하고 관리하도록 한다.다들 알다시피 viewmodel을 이용하면 화면에 대한
velog.io
'Android > Study' 카테고리의 다른 글
[Android] Retrofit의 내부구조와 동작 알아보기 (0) | 2025.03.26 |
---|---|
[Android] 코루틴 정리 feat. suspend 키워드까지 (0) | 2025.03.19 |
[Android] 인텐트(Intent) 및 인텐트 필터(Intent Filter) (0) | 2025.02.20 |
[Android] Jetpack Compose의 Recomposition 정리 (0) | 2025.02.20 |
[Android] Jetpack Compose 개념 및 XML과의 비교 (0) | 2025.02.20 |