[Android] MVVM

mi-fasol·2023년 11월 20일
0

Kotlin

목록 보기
4/5

오늘은 안드로이드의 MVVM에 관하여 포스팅을 할까 한다.

아마 개발을 하다가 한 번쯤은 들어보았을 것 같은데, MVVM이란 Model, View, ViewModel의 줄임으로 뷰가 특정 모델에 의존하지 않도록 하는 소프트웨어 디자인 패턴이다.

MVVM은 아래와 같은 장점을 가지고 있다.

  • 관심사 분리
    • 각 컴포넌트가 각자의 역할에만 집중
  • 유연한 UI 개발
  • 테스트 용이성
  • 유지보수 및 재사용 용이
  • 데이터의 일관성 유지

MVVM은 모듈화와 분리가 목적인 패턴인만큼, UI 중심의 어플리케이션에서 유용하게 사용된다.
UI와 비즈니스 로직이 독립적으로 존재하여 변경 사항의 빠른 적용과 테스트가 가능해진다.

코틀린에서는 위의 사진과 같은 앱 아키텍처를 권장하고 있다.

액티비티나 프래그먼트가 뷰모델에만 종속된 걸 볼 수 있는데, 각 구성요소가 한 수준 아래의 구성 요소에만 종속되어 있는 구조다.

그렇다면 본격적으로 Model, View, ViewModel에 대해 알아보기로 하자.

Model

Model은 어플리케이션의 데이터와 비즈니스 로직을 담당하는 요소다.

쉽게 말해 만약 우리가 User라는 데이터 클래스를 생성하게 된다면, 이게 MVVM의 Model이 되는 거다.

네트워크 요청이나 데이터베이스 접근, 데이터 가공 등의 작업을 수행할 수 있다.

data class User(
	val id: Int,
    val name: String
)

위의 코드가 Model의 코드다.
뷰와 뷰모델 관련한 정보는 아무것도 없도록 작성해야 한다.

View

그렇다면 View는 무엇일까?

View는 말 그대로 UI와 사용자의 입력을 처리하는 요소다.
사용자와 상호작용하고, 화면의 데이터를 표시하며 입력 등으로 인해 발생하는 이벤트를 ViewModel에 전달해야 한다.

View는 화면에 보여지기 위한 코드만 작성하도록 최소한의 로직을 가지고 있어야 한다.

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.Observer
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    private lateinit var viewModel: UserViewModel

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

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

        viewModel.user.observe(this, Observer { user ->
            displayUserInfo(user)
        })

        updateButton.setOnClickListener {
            val newUser = User(1, "Mi-fasol")
            viewModel.updateUser(newUser)
        }
    }

    private fun displayUserInfo(user: User) {
        userIdTextView.text = "Id: ${user.id}"
        userNameTextView.text = "Name: ${user.name}"
    }
}

이렇게 사용자 입력을 처리하고, 뷰모델의 로직을 가져와 쓰는 게 뷰다.

ViewModel

마지막으로 ViewModel은 View와 Model의 중간 매개체로, UI와 관련된 로직을 처리하는 요소다.

View에서 입력을 받은 값을 Model에 전달하고, Model의 데이터를 받아와 View에 전달한다.
ViewModel에서는 View의 상태를 관리하고 비즈니스 로직을 처리해야 한다.

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class UserViewModel : ViewModel() {

    private val _user = MutableLiveData<User>()

    val user: LiveData<User>
        get() = _user

    fun updateUser(newUser: User) {
        _user.value = newUser
    }
}

아까 있던 View에서 LiveData를 활용하고 있기 때문에, 뷰모델의 _user 변수도 MutableLiveData로 생성해야 한다.

이렇게 하면, 이벤트가 발생할 때 즉각적으로 View에 반영해 줄 수 있다.

보이는 것처럼 User 입력 이벤트에 대한 처리만 담당하는 게 ViewModel이다.


오늘은 간단하게 MVVM에 대해서 알아봤다.

오늘 GDSC Android Study가 있는 날인데, 추가적으로 알게 되는 정보가 있으면 포스트를 수정하며 다시 개념을 잡아야겠다.

profile
정위블

0개의 댓글