본문 바로가기

android studio

[Android] ViewModel 이란?

ViewModel 이란?

  • ViewModel은 안드로이드 아키텍처 컴포넌트 중 하나로, UI 관련 데이터를 관리하는 클래스
  • 액티비티(Activity)나 프래그먼트(Fragment)가 변경되거나 소멸되더라도 데이터를 유지할 수 있도록 도와준다.

 

ViewModel의 주요 역할

  1. UI 데이터를 유지
    • 화면 회전과 같은 구성 변경(Configuration Change) 시에도 데이터가 유지된다.
    • 액티비티나 프래그먼트가 재생성되더라도 데이터가 초기화되지 않는다.
  2. UI 로직과 비즈니스 로직을 분리
    • UI(View)는 ViewModel에 있는 데이터를 관찰(Observe)하면서 화면을 업데이트한다.
    • 데이터 처리를 ViewModel 에서 담당하므로 코드의 재사용성과 테스트 가능성이 높아진다.
  3. LiveData 또는 StateFlow와 함께 사용 가능
    • LiveDate 또는 StateFlow를 사용하면 UI에서 데이터 변화를 감지하여 자동으로 업데이트할 수 있다.

 

ViewModel의 특징과 장점

특징 설명
UI 데이터를 유지 화면 회전 시에도 데이터가 초기화되지 않음
수명 주기와 연동 ViewModel은 액티비티/프래그먼트의 수명 주기와 독립적
비즈니스 로직 분리 UI 로직과 데이터 로직을 분리하여 코드의 재사용성과 유지보수성을 높임
LiveData 또는 StateFlow 활용 가능 LiveData, Flow와 함께 사용하여 데이터 변경을 UI에 반영 가능

 

 

ViewModel 사용 예제

class MyViewModel : ViewModel() {
    private val _count = MutableLiveData<Int>(0)  // 변경 가능한 데이터
    val count: LiveData<Int> = _count  // UI에서 관찰할 데이터

    fun increaseCount() {
        _count.value = (_count.value ?: 0) + 1
    }
}

 

class MainActivity : AppCompatActivity() {
    private lateinit var viewModel: MyViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

        viewModel.count.observe(this) { newValue ->
            textView.text = newValue.toString()
        }

        button.setOnClickListener {
            viewModel.increaseCount()
        }
    }
}

 

 

ViewModel과 RoomDB 활용 예시

@HiltViewModel
class ChatViewModel @Inject constructor(
    private val chatRepository: ChatRepository
) : ViewModel() {

    val chatMessages: LiveData<List<ChatMessage>> = chatRepository.getAllMessages()

    fun sendMessage(message: ChatMessage) {
        viewModelScope.launch {
            chatRepository.insertMessage(message)
        }
    }
}