안드로이드 - ViewModel, LiveData 정의

이우건·2023년 3월 14일
0

안드로이드

목록 보기
5/20

ViewModel 개요

ViewModel 클래스는 수명 주기를 고려하여 UI 관련 데이터를 저장하고 관리하도록 설계되었다.
ViewModel 클래스를 사용하면 화면 회전과 같이 구성을 변경할 때도 데이터를 유지할 수 있다.

이렇게 생성된 ViewModel은 Activity 혹은 Fragment와 다른 생명주기를 가지게 된다.
finish 메서드가 호출됐을 때 혹은 사용자가 직접 뒤로 가기 버튼을 눌러 액티비티를 종료했을 때 onCleared() 메서드를 통해 ViewModel은 비로소 소멸이 된다.
이렇게 ViewModel을 분리하면 다음과 같은 장점이 있다.

  • 생명 주기에 영향을 받지 않고 데이터를 유지할 수 있다.
  • UI 컨트롤러와 데이터가 분리된다.
  • 프래그먼트 간의 데이터 공유가 쉬워진다.

ViewModel 구현

아키텍처 구성요소는 UI의 데이터 준비를 담당하는 UI 컨트롤러에 ViewModel 도우미 클래스를 제공한다.
ViewModel 객체는 구성이 변경되는 동안 자동으로 보관되므로, 이러한 객체가 보유한 데이터는 다음 Activity 또는 Fragment 인스턴스에서 즉시 사용할 수 있다.

LiveData 클래스와 함께 사용

EX)

class MyViewModel : ViewModel() {
    private val users: MutableLiveData<List<User>> by lazy {
        MutableLiveData<List<User>>().also {
            loadUsers()
        }
    }

    fun getUsers(): LiveData<List<User>> {
        return users
    }

    private fun loadUsers() {
        // Do an asynchronous operation to fetch users.
    }
}

users 변수는 MutableLiveData 객체를 생성하면서 loadUsers() 메서드를 호출해서 데이터를 추가한다.

loadUsers() 메서드는 데이터 레이어의 Repository를 통해 데이터를 요청

getUsers() 변수는 클래스 멤버 변수 users를 불변의 타입으로 변경하여 반환한다.

class MyActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        // Create a ViewModel the first time the system calls an activity's onCreate() method.
        // Re-created activities receive the same MyViewModel instance created by the first activity.

        // Use the 'by viewModels()' Kotlin property delegate
        // from the activity-ktx artifact
        val model: MyViewModel by viewModels()
        model.getUsers().observe(this, Observer<List<User>>{ users ->
            // update UI
        })
    }
}

Activity에서 ViewModel 생성한 후 getUsers를 호출하여 observe 메서드를 호출한다.

observe 메서드는 LiveData에서 지원한다.

LiveData 개요

LiveData는 안드로이드 앱의 아키텍처 컴포넌트 중 하나로, 데이터를 관찰 가능한 객체로 만들어준다.

LiveData는 데이터의 변경사항을 관찰하고, 데이터가 변경될 때마다 관찰자들에게 알림을 보내준다. 이는 앱의 UI를 업데이트하는데 사용될 수 있다.

LiveData는 또한 생명주기를 인식하므로, 생명주기가 끝나면 자동으로 관찰을 중단한다. 이를 통해 메모리 누수와 같은 문제를 방지할 수 있다.

LiveData 객체 사용

  1. 특정 유형의 데이터를 보유할 LiveData의 신스턴스를 생성한다. 이 작업은 일반적으로 ViewModel 클래스 내에서 이루어진다.

  2. onChanged() 메서드를 정의하는 Observer 객체를 만든다. 이 메서드는 LiveData 객체가 보유한 데이터 변경 시 발생하는 작업을 제어한다.
    일반적으로 Activity나 Fragment 같은 UI 컨트롤러에 Observer 객체를 만든다.

  3. observe() 메서드를 사용하여 LiveData 객체에 Observer 객체를 연결한다. observe() 메서드는 LifecycleOwner 객체를 사용한다. 이렇게 하면 Observer 객체가 LiveData 객체를 구독하여 변경사항에 관한 알림을 받는다.
    일반적으로 Activity나 Fragment 같은 UI 컨트롤러에 Observer 객체를 연결한다.

profile
머리가 나쁘면 기록이라도 잘하자

0개의 댓글