ViewModel과 LiveData
ViewModel로 구성 변경을 견뎌 내는 앱을 만듭니다. LiveData로 반응형 데이터 스트림을 노출하고 Activity와 Fragment에서 관찰합니다.
ViewModel과 LiveData은(는) CoddyKit의 무료 Android Academy 강의입니다. 이것은 6개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Android Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Android Academy 강의에는 총 6개의 강의가 포함되어 있습니다.
Activity의 문제점
Activity에 데이터를 직접 저장하면 두 가지 큰 문제가 발생합니다.
- 사용자가 휴대전화를 회전하면 Activity가 소멸되었다가 다시 생성되므로 모든 데이터가 사라집니다.
onCreate에서 네트워크 데이터를 가져오면 회전할 때마다 다시 가져오므로 비효율적입니다.
ViewModel은 두 문제를 모두 해결합니다.
ViewModel이란 무엇인가요
ViewModel은 다음 기능을 제공하는 Android 아키텍처 구성 요소입니다.
- 구성 변경을 유지합니다. (회전, 테마 변경)
- UI 관련 데이터와 비즈니스 로직을 보관합니다.
- 사용자가 화면을 영구적으로 벗어날 때만 소멸됩니다.
기억할 원칙: 회전 후에도 유지되어야 하는 데이터는 ViewModel에 넣으세요.
ViewModel 만들기
ViewModel을 상속하고 Gradle 종속 항목에 추가하세요.
// app/build.gradle:
// implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0'
// implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.7.0'
import androidx.lifecycle.ViewModel
class CounterViewModel : ViewModel() {
var count = 0
private set
fun increment() {
count++
}
fun reset() {
count = 0
}
}Activity에서 ViewModel 가져오기
ViewModelProvider 또는 by viewModels() 위임을 사용하여 ViewModel 인스턴스를 가져오세요.
import androidx.activity.viewModels
class CounterActivity : AppCompatActivity() {
private lateinit var binding: ActivityCounterBinding
// Android manages the ViewModel lifecycle — never instantiate it yourself
private val viewModel: CounterViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityCounterBinding.inflate(layoutInflater)
setContentView(binding.root)
// This shows the count is preserved after rotation!
binding.tvCount.text = viewModel.count.toString()
binding.btnPlus.setOnClickListener {
viewModel.increment()
binding.tvCount.text = viewModel.count.toString()
}
}
}LiveData란 무엇인가요
LiveData는 관찰 가능한 데이터 보관 객체입니다. UI가 LiveData 값을 관찰하면 값이 변경될 때 UI가 자동으로 업데이트됩니다.
- 수명 주기를 인식합니다. 활성 상태인 관찰자만 업데이트하므로 Activity가 백그라운드에 있을 때도 오류가 발생하지 않습니다.
- 항상 최신 상태입니다. 새 관찰자는 즉시 최신 값을 받습니다.
ViewModel에서 LiveData 사용하기
MutableLiveData는 비공개로 사용하여 ViewModel만 쓸 수 있게 하고, LiveData로 공개하여 UI는 관찰만 할 수 있게 하세요.
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class CounterViewModel : ViewModel() {
private val _count = MutableLiveData(0)
val count: LiveData<Int> = _count // read-only for the UI
fun increment() {
_count.value = (_count.value ?: 0) + 1
}
fun reset() {
_count.value = 0
}
}Activity에서 LiveData 관찰하기
변경에 반응하려면 .observe(lifecycleOwner) { value -> }를 호출하세요.
class CounterActivity : AppCompatActivity() {
private val viewModel: CounterViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ...
// Automatically updates TextView whenever count changes
viewModel.count.observe(this) { count ->
binding.tvCount.text = count.toString()
}
binding.btnPlus.setOnClickListener { viewModel.increment() }
binding.btnReset.setOnClickListener { viewModel.reset() }
}
}LiveData와 State Flow 비교
LiveData는 전통적인 방식입니다. 현대적인 코틀린 코드에서는 대신 Kotlin 코루틴의 StateFlow를 자주 사용합니다.
StateFlow— 코루틴 기반이며 Android 종속 항목이 필요하지 않습니다.- Activity에서
repeatOnLifecycle을 사용하여 수집합니다. - 복잡한 상태 관리에 더 적합합니다.
둘 다 잘 작동합니다. LiveData는 처음 시작하기 더 간단하고, 규모가 큰 앱에서는 StateFlow를 보게 될 것입니다.
여러 관찰자를 사용하는 ViewModel
여러 UI 구성 요소가 동일한 LiveData를 관찰할 수 있습니다. 예를 들어 TextView와 Button의 활성화 상태가 모두 ViewModel의 동일한 데이터 값에 반응하도록 만들 수 있으며, 이를 위해 ViewModel에 별도의 코드를 추가할 필요가 없습니다.
이렇게 하면 역할이 깔끔하게 분리됩니다. ViewModel은 상태를 보관하고 UI는 관찰한 후 표시하기만 합니다.
빠른 확인
ViewModel은 언제 소멸되나요?
복습: ViewModel과 LiveData
이제 수명 주기를 인식하는 UI를 만드는 방법을 알게 되었습니다.
- ViewModel은 구성 변경을 유지합니다. (회전)
- Activity에서 ViewModel을 가져오려면
by viewModels()를 사용합니다. - MutableLiveData(비공개) / LiveData(공개) 패턴을 사용합니다.
.observe(this) { value -> updateUI(value) }로 관찰합니다.- UI가 자동으로 업데이트되므로 수동으로 새로 고칠 필요가 없습니다.
다음: Room 데이터베이스로 데이터를 영구적으로 저장해 보세요.
자주 묻는 질문
“ViewModel과 LiveData” 강의는 무료인가요?
네 — “ViewModel과 LiveData” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Android Academy 강의 전체를 잠금 해제할 수 있습니다. Android Academy 강의에는 총 6개의 강의가 포함되어 있습니다.
“ViewModel과 LiveData”에서 뭘 배우나요?
ViewModel로 구성 변경을 견뎌 내는 앱을 만듭니다. LiveData로 반응형 데이터 스트림을 노출하고 Activity와 Fragment에서 관찰합니다. 브라우저에서 직접 실행하는 실습 코드로 Android Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Android Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Android Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 6개 중 1번째 강의입니다.
“ViewModel과 LiveData” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Android Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Android Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- ViewModel과 LiveData
- Room 데이터베이스
- 코루틴과 일시 중단 함수
- 리포지터리 패턴
- Navigation Component
- Hilt를 사용한 의존성 주입