[kotlin] viewModel & LiveData

Boknami·2024년 1월 17일
0

코틀린

목록 보기
16/19

🤔 왜 굳이 이걸 쓸까..귀찮은데

대학 강의에서 처음 뷰모델과 라이브 데이터에 듣게 되었다. 그 당시에는 '굳이 뭐 이렇게 복잡하게까지 할려고해? 그냥 만들어도 괜찮겠구만' 싶은 어리석은 생각에 집중하지 않고 넘어가게 되었고 개발에서도 사용하지 않았다.

이번에 교육 사이트에서 유료강의를 구매하면서도 뷰모델과 라이브 데이터가 등장해서 그냥 적당히 이해하고 넘어가려고 했는데 이런식으로 공부해서는 MVVM을 완벽하게 이해할 수 없을 것 같았다.

그럼 왜 이걸 사용할까?

코드를 볼 때 왜 이렇게까지 귀찮고 복잡하게까지 할까 싶은 내용들은

  • 응집도
  • 결합도
  • 유지 및 보수

3가지로 거의 이해가 가능할 것 같다.

사실 예전에도 이 이야기는 들어왔는데 뭔가 와닿지 않았다.
그거 안쓰고도 그냥 개발하면 앱 만들 수 있으니까

그런데 개발을 해오면서 새 기능을 넣을 때 기존 코드를 수정하는 경우나 액티비티가 너무나도 비대해지는 경우 등 SOLID패턴에 반하는 코드를 계속 내가 작성해오면서 실제 느껴보니 여러 가지를 고려하는 이유를 조금씩 알 것 같았다.

[1] viewModel

화면 회전 말고 다른 예제를 봐야하지 않을까?

뷰모델을 학습하게 될 때 가장 일반적으로 배우는 내용이 화면을 회전시키며 count했던 값이 초기화 되는 예제를 가장 많이 보게 된다.

나는 사실 여기서부터 뷰모델에 흥미를 잃었다. 만들어온 앱들도 그렇고 게임 같은 앱을 제외하고는 화면을 회전할 일? 거의 없다. 아니면 화면 회전 자체를 막아버려도 되는 일이고

그럼 다른 예제는?

회전을 제외하면 안드로이드의 생명주기. 환경에 관련이 된 예제가 보였다.
안드로이드는 데스크톱 같이 안정적 환경이 아니라 다양한 갑작스러운 일이 발생하는 경우가 많다.

전화가 온다던가 메모리 초과로 앱이 강제 종료 된다던가 그리고 앱을 회전하는 것도 생명주기와 관련이 있다.

이렇게 갑자기 꺼져버렸을 때 가지고 있는 데이터가 소실 되어버린다. 물론 내부 저장소에 저장을 하는 방법이나 savedInstanceState를 이용하는 방법도 있지만 우선 savedInstanceState는 Bundle이라는 타입에 저장이 되고 이 타입이 저장할 수 있는 용량이 적다.

회전 안쓰고, 데이터를 많이 다루지 않는다면 안써도 되겠네?

엄청 간단한 기능을 하는 앱에서는 굳이 사용하지 않아도 된다고 생각한다.
(물론 내 생각이지만..)

하지만 구글에서 공식적으로 뷰모델을 사용하는 것을 권장한다.
그럼 구글에서는 이 뷰모델을 왜 사용하라고 하는걸까?

결국엔 MVVM패턴에 맞게 앱을 만들어서 앱을 모듈화하고 앱의 결합도,응집도가 고려된 앱을 만들기 위해서라고 나는 생각한다..그 편이 이해가 가장 빠르기도 하고.

[2] LiveData

갑자기 왠 라이브데이터?

viewModel과 LiveData를 이용하면 MVVM구조를 쉽게 만들 수 있다.

LiveData는 2가지 있다.

  • LiveData : 라이브 데이터
  • MutableLiveData : 변경이 가능한 라이브 데이터

나는 처음에 이 부분이 이해가 정말 안되었다.

우선 순서 전부를 이해해보자

  • MVVM에서는 V가 VM을 쳐다보고 있는다.
  • 그러다가 VM에 변경이 생기면 V를 갱신한다
  1. view는 observe를 이용해서 VM에 변경사항을 지켜보고 있는다.
  2. VM은 API통신을 통해서 viewModel의 MutableLiveData를 갱신한다.
  3. VM의 LiveData는 곧 갱신된 데이터다.
  4. view는 observe를 통해 변화를 감지한다.
  5. view는 viewModel에 LiveData에 get을 해서 값을 가져온다
  6. 변경된 내용을 view가 갱신한다

그럼 MutableLiveData는 왜 굳이 써?

LiveData는 변경이 불가능하고 외부 클래스에서는 get밖에 못하도록 만들어서 외부에서 데이터를 변경할 수 없도록 이러한 행동을 하는 것을 이해하겠다만은

그렇다면 애초에 그냥 API를 통해서 데이터를 받아오고 그 데이터를 LiveData에 넣기만 하면 되는 것 아닌가? 라는 생각에 이 MutableLiveData가 이해가 되지 않았다.

사용하는 이유를 보자면 MutableLiveData는 LiveData의 값을 변경할 수 있도록 setValue 및 postValue와 같은 메서드를 제공하는 LiveData의 하위 클래스이기 때문에 써야한다고 한다.

그냥 뭔가 전부를 이해하기보다 LiveData를 사용하기 위해서는 MutableLiveData가 선행적으로 필요하다~ 이런 식으로 생각했다.

💬 관련 코드를 보며 마무리

ViewModel

class MyViewModel : ViewModel() {
    // 데이터를 담기 위한 홀더인 MutableLiveData 
    private val _data = MutableLiveData<String>()

    // 외부에서 data접근을 위해 데이터를 담아 놓는 홀더인 LiveData
    val data: LiveData<String> get() = _data

    // 뷰모델 안에서 데이터를 갱신하기 위한 함수
    fun updateData(newData: String) {
        _data.value = newData
    }
}

Activity

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

class MyActivity : 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.data.observe(this, Observer { newData ->
            //새로운 데이터를 이용해서 UI변경!
            textView.text = newData
        })

        // Trigger an update (for example, when a button is clicked)
        updateButton.setOnClickListener {
            val newData = editText.text.toString()
            viewModel.update

0개의 댓글