0Pricing
Android Academy · 강의

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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. ViewModel과 LiveData
  2. Room 데이터베이스
  3. 코루틴과 일시 중단 함수
  4. 리포지터리 패턴
  5. Navigation Component
  6. Hilt를 사용한 의존성 주입
← Android Academy(으)로 돌아가기