Android (안드로이드)

[Android] LiveData / MutableLiveData / 라이브 데이터 / 사용법 / 예제

Oscar:) 2024. 2. 13. 20:46

 

 

이번 포스팅에서는 라이브 데이터에 대해 알아보자.

 

 

 


 

라이브 데이터란?

 

 

공식 문서 ↓

 

 

LiveData 개요  |  Android 개발자  |  Android Developers

LiveData를 사용하여 수명 주기를 인식하는 방식으로 데이터를 처리합니다.

developer.android.com

 


 

 

라이브 데이터는 Android Jetpack에 포함된 라이브러리이며

관찰 가능한 데이터 홀더 클래스다.

 

관찰 가능한 다른 클래스도 있지만, 라이브 데이터가 다른 점이 있다면

액티비티 · 프래그먼트의 생명주기를 인식한다.

 

 

관찰자로는 Observer 클래스를 사용하며 해당 클래스를 사용하기 위해서는

LifecycleOwner를 지정해줘야 한다.

 

LifecycleOwner에는 액티비티 · 프래그먼트 등이 지정될 것이다.

 

 

 


 

라이브 데이터 사용의 이점

 

 

라이브 데이터를 사용할 때의 이점은 생각보다 많다.

 

대부분 생명 주기가 자동으로 관리되기 때문인 장점이라고 볼 수 있다.

 

 

 

✅ UI와 데이터 상태의 일치 보장

 

라이브 데이터는 Observer 패턴을 따른다.

개발자가 별도로 UI를 업데이트할 필요 없이 Observer가 UI를 업데이트한다.

 

 

✅ 메모리 누수 없음

 

LifecycleOwner가 라이브 데이터와 결합되어 있기에 해당 생명 주기가 종료되면

LiveData 객체도 자동으로 삭제된다.

 

 

✅ 중지된 액티비티로 인한 비정상 종료가 없음

 

액티비티 · 프래그먼트 등이 백 스택에 있을 때를 비롯하여

생명 주기가 비활성 상태에 있다면 라이브 데이터는 어떠한 이벤트도 받지 않는다.

 

 

✅ 최신 데이터 유지

 

생명 주기가 비활성 상태에서 활성 상태로 돌아올 때 다시 최신 데이터를 수신한다.

기기 회전과 같은 구성 변경으로 액티비티 · 프래그먼트가 다시 생성되어도 마찬가지다.

 

 

 


 

사용해보자

 

 

예제를 보기 전, MutableLiveData와 LiveData에 대해 알아야 한다.

 

 

✅ MutableLiveData & LiveData

 

MutableLiveData는 LiveData를 상속한다.

그렇기에 웬만한 상황에서 LiveData를 대체할 수 있다.

 

차이점이라고 하면 다음과 같다.

 

- MutableLiveData : 값을 수정할 수 있는 LiveData

- LiveData : 값의 수정이 불가능한 LiveData

 

MutableLiveData는 setValue() · postValue() 메서드를 통해 값을 수정할 수 있다.

 

 

 

 

● 왜 위와 같이 2가지로 분류했을까?

 

 

MutableLiveData를 직접 관찰하여 UI를 업데이트해도 되지만,

외부에서 값을 수정할 수도 있는 등의 위험이 있다.

 

그렇기에 데이터가 변경되면 MutableLiveData의 값을 수정해주고

이를 LiveData에 초기화하여 Observer는 LiveData를 관찰하게끔 해준다.

 

LiveData는 MutableLiveData에게 데이터를 대입 받고

Observer에게 관찰당하는 역할만 해준다고 보면 된다.

 

 

 

그리고 두 객체를 구분할 때 사용하는 암묵적인 룰이 있다.

MutableLiveData 변수명 앞에는 언더바(_)를 붙여 사용한다.

 

 

 


 

 

✅ 예제

 

Activity와 ViewModel만을 사용하여 간단한 예제를 만들어 본다.

 

프로세스는 다음과 같다.

 

1. Activity에서 ViewModel의 LiveData를 반환하는 getName() 메서드를 관찰한다. (Observe)

2. Activity에서 버튼 클릭 이벤트가 발생하면 ViewModel에 있는 setName() 메서드를 호출한다.

3. setName() 메서드에서는 MutableLiveData의 값 변경이 일어난다.

4. MutableLiveData의 값이 변경되면 getName() 메서드의 반환 값도 변경되므로
Activity에서 변화를 감지하여 텍스트뷰가 업데이트 된다.

 

 

 

● Activity

onCreate() {
...

// ViewModel의 getName() 메서드 관찰 (LiveData 반환하는 메서드)
// LifecycleOwner가 들어갈 인수에 this(Activity)를 넣었다.
viewModel.getName().observe(this, new Observer<String>() {
    @Override
    public void onChanged(String s) {
        // 텍스트뷰 업데이트
        textView.setText(s);
    }
});

// 버튼 클릭 리스너
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // ViewModel의 MutableLiveData 값 변경해주는 메서드 호출
        viewModel.setName();
    }
});
}

 

ViewModel, TextView, Button 등의 초기화 부분은 생략했다.

 

중요 부분마다 주석을 달았으니 확인하기 바란다.

 

 

 

ViewModel

public class ViewModel extends androidx.lifecycle.ViewModel {

    // 외부 수정을 막기 위해 private 선언
    private final MutableLiveData<String> _name = new MutableLiveData<>();

    public LiveData<String> getName() {
        // MutableLiveData가 LiveData를 상속하기 때문에
        // LiveData로 반환 가능
        return _name;
    }

    public void setName() {
        // 간단한 랜덤 로직
        int i = new Random().nextInt(2);
        String nameValue = i == 0 ? "Oscar" : "오스카";
        
        // MutableLiveData 값 수정
        _name.setValue(nameValue);
    }

}

 

마찬가지로, 중요 부분마다 주석을 달았으니 확인하기 바란다.

 

 


 

 정리

 

ViewModel에서 Activity를 참조하는 행위 등을 통해 UI 업데이트에 직접적인 개입을 하지 않았다.

 

Activity에서 ViewModel의 LiveData를 Observe하여 TextView를 업데이트 해준다.

 

 

 

사실 setName() 메서드 안의 일부 내용은 Model에서 해야하는 작업이다.

하지만 이번 포스팅은 MVVM 패턴 예제가 아니기 때문에,
LiveData 기본 개념 이해만 집중할 수 있도록 ViewModel에서 처리했다.

만약 Model까지 사용하는 상황이라면, MutableLiveData는 Model에서 활용하기도 한다.

 

 


 

결과

 

 

값이 잘 바뀌는 것을 확인했다.

 

 


 

 

 

이번 포스팅에서는 라이브 데이터에 대해 알아보았다.

 

여러모로 유용하게 사용할 수 있을 것 같다.