Android

Livedata 를 적극 사용하자 (feat ViewModel - MVVM과 다르다!)

Dean83 2023. 1. 25. 16:22

아직 모르는것이 많기 때문에 추후에 또 변경될 수 도 있다. 쓰지 말자 라고..

 

지금껏 파악하기로는, 적극적으로 사용하는것을 권장한다. 

 

일단 ViewModel 부터 정리하자면, 일반적으로 디자인패턴에서 말하는 ViewModel 과는 다르다. 

물론 MVVM 패턴의 ViewModel을 내포할 수 있지만, 근본적으로는 다른 의미 이다. 

 

Livadata의 경우 C#의 Observable과 동일한 것으로 보이는데, 활용도가 완전히 다르다. 

아무래도 안드로이드 특성이 윈도우와 다르다보니... C#에서는 한정적으로 사용하나, 안드로이드에선

여기저기 다 써도 무방해 보인다.
(정확히 말하자면 C# 에서는 변수값이 변경되었을때 처리해야 할 일이 별로 없다. UI 정도..)

 

 

1. 안드로이드 에서의 ViewModel
     - 안드로이드 라이프사이클과 연관되어 있다. 

     - Activity 나 Fragment는 화면 회전 등이 이루어 질때 distroy 되었다가 다시 생성된다.
       그러나 ViewModel은 그렇지 않다. 라이프사이클이 길다. (finish 혹은 detatch 될때까지 살아있다)

    - 화면 회전등으로 인해 Activity, Fragment 가 재 실행될때 문제가 아주 많다. 보다 긴 ViewModel을
       사용할 경우 데이터의 변화나 저장, 유지가 수월하기에 ViewModel 쓰는것을 적극 권장하며, 
       이는 MVVM의 뷰모델과는 다른 의미이다

    - 물론 ViewModel 안에서 MVVM에서 말하는 ViewModel 형식으로 구현하면 둘 다 만족하게 된다.

    * C# 에서 MVVM 구현시에는 View 에는 아무 코드도 구현하지 않는다. 하지만 안드로이드에선
       UI에 관련된 코드는 View 에 구현하고(Livedata observe), ViewModel 에서 Livedata에 값을 배정하는 방식으로
       구현한다. 

 

 

2. Livedata
     - observe 함수를 통해 변수값에 변화가 생겼을때 동작 처리를 할 수 있다. 
        예 : ) xxx.observe (lifecyclerowner 변수){ textView.text = it } 으로 처리하고,
                 xxx.value = "test" 으로 값의 변화를 줄 수 있다. 

     - ViewModel을 위해 만들어 졌다 한다. 메모리 leak 방지.
        -> ViewModel의 라이프사이클이 훨씬 길기 때문에 Activity나 Fragment가 재시작되고 난리를 피워도 문제없다. 

     - Activity, Fragment가 살아 있을 때에만 observe가 호출되며, 재실행시에도 자동으로 호출 된다. 
        ->  이게 가장 큰 이유인데, 화면 회전등으로 인해 재시작 될 때에도 기존 데이터를 자동으로 유지할 수 있다는 뜻.

 

 

안드로이드의 빌런중 하나를 꼽자면, Activity나 Fragment의 재시작을 꼽을 수 있다. 이때 어플이 잘 죽기도 하고 오동작도 잘 한다. UI가 이상해 지기도 하고.   이를 그나마 최대한 막을 수 있는것이 LiveData를 활용하는것으로 보인다. 

 

즉, observe 안에 UI를 변경토록 코드를 짜 놓는 식으로 구현하는게 좋아 보인다.