본문 바로가기
Android 개발/Architecture 라이브러리

LiveData와 Realm 그리고 ViewModel을 같이 이용하는 방법

by Developer88 2019. 10. 14.
반응형

Android Architecture 라이브러리가 나오고

LiveData의 등장하면서 Realm과 같이 하면,

Reactive하면서도 Lifecycle에 대응가능하게 되었는데요.

오늘은 그 방법에 대해서 정리해 보고자 합니다.

1. Realm과 LiveData를 같이 사용하는 방법

이 둘을 같이 사용하기 위해서는,

Realm의 결과 값을 listen하는 listener가 붙어있는 Wrapper클래스를 생성해서,

listerner에서 그 결과값을 받으면, LiveData타입의 데이터를 set해주면 됩니다.

그럼 먼저 Realm을 initialize하는 것 부터 보도록 하겠습니다.

 

2. Realm initialize

먼저 아래와 같이 Application클래스에서 Realm을 initialize해 주었습니다.

 

 

3. Realm 데이터 클래스 생성

RealmObject를 상속받는 데이터 클래스를 작성해서 DB에 데이터를 넣을 준비를 합니다.

이렇게 코드가 짧은 건, Kotlin과 따로 Dao클래스가 필요하지 않는 Realm의 시너지 덕분이겠지요.

 

 

 

4. LiveDataWrapper클래스 작성

먼저, LiveData와 RealmObject을 같이 사용하기 위한 Wrapper클래스를 다음과 같이 만들어 줍니다.

Wrapper클래스라고 거창하게 애기하였지만,

실제로는 Realm의 RealmResults<T>타입의 결과 값이 나오면, 결과값으로 value에 set해주는 단순한 listener만 가지고 있습니다.

LiveData에서는 onActive때와 onInActive메소드를 사용할 수 있게해주므로, 

라이프사이클에 맞춰서 listener를 등록 및 해제 할 수 있도록 이 메소드들을 활용해 줍니다.

 

이 클래스에는 직접 결과값을 반환받을 수 있는 function은 없으므로, 초기화는 따로 또 해주어야 겠네요.

대신 초기화 이후에, RealmResult의 변화값에 대해서 listen할 수 있으므로, 그 변화값을 반영할 수 있는 것 이지요.

 

위에서 LiveRealmData<T: RealmModel>이 생소할 수 있는데요.

이것은 Kotlin Generic의 UpperBound로 자세한 내용은, 아래 글의 3-1. Upper Bound를 참조해 주시면 됩니다.

>> Kotlin 에서의 Generic

 

5. LiveData타입으로 return하는 메소드 생성

Kotlin Extensions를 이용하면, 아래와 같이 간단하게

RealmResult들을 LiveRealmData형식으로 바꿀 수 있습니다.

asLiveData()함수를 추가하고, 위에서 생성한 Wrapper클래스인 LiveRealmData타입으로 반환되도록 해 줍니다.

참고로 Extension Functions에 대한 글은 아래 링크를 참조해 주세요

>> Kotlin Extension Functions에 대한 정리

 

 

6. realm의 query결과를 LiveData의 result로 받아보기

위에서 했던 것들을 다시 한번 정리해 보면,

먼저 RealmDB의 결과 값을 LiveData타입으로 Wrap하는 Wrapper클래스를 생성했구요.

Extension Function를 이용해서 RealmResult타입의 데이터를,

위에서 생성한 Wrapper클래스인 LiveRealmData타입으로 전환할 수 있는 함수인 asLiveData()를 추가했습니다.

 

위에서 추가한 asLiveData()함수를 사용해 주면, 쉽게 RealmResult를 LiveData타입으로 바꿀수 있습니다.

 

 

 

이제 Realm을 LiveData타입으로 변환시키는 것은 다 되었네요.

남은 것은 ViewModel에서 어떻게 쓰는 가 입니다.

 

7. ViewModel

ViewModel은 View와 관련된 Data들을 매니징하는 곳인데요.

Realm의 데이터도 마찬가지 입니다.

 

먼저 lazy하게 initilaize되는 realm을 가져오구요.(lazy한 것이 필수는 아닙니다)

ViewModel의 onCleared에서 닫아줍니다.

 

 

8. DAO생성

ViewModel에서 접근할 Student dao클래스를 아래와 같이 생성해 줍니다.

중요한 것은 가장 처음 함수에서, asLiveData()타입을 이용해서, 

위에서 생성한 Wrapper클래스를 이용해 LiveData를 set하였다는 것 이지요.

 

 

위에서 ViewModel클래스에서,

위에서 생성한 DaoClass에 액세스해서, 필요한 함수를 호출해 주면 되는데요.

getAllStudentDataObserved()를 호출하면, Realm의 결과를 Live데이터로 set해주는 리스너를 달아주게 되는 것 이지요.

 

 

9. Activity

Activity에서 하는 일은 ViewModel을 이용해 뷰에 그리거나, 유저로부터 입력 받은 값을 이용해,

Realm과 상호작용하는 것 인데요.

예를 들면, 위의 메소드중 insert를 이용해 아래와 같이 데이터를 넣을 수 있습니다.

 

RecyclerView를 사용했다고 가정하면,

아래와 같이 ViewModel에 정의된 함수를 호출하면,

값이 변할 때 마다, adapter에 넣어서 리스트를 업데이트 할 수 있습니다.

(대신 여기에는 초기화 하는 코드가 없으므로, 처음에 초기화 하는 코드는 추가 되어야 겠네요.)

 

 

이렇게 해서 LiveData와 Realm그리고 ViewModel을 같이 사용하는 방법을 정리해 보았습니다.

더 좋은 방법이 있으면 이 글을 통해서 업데이트 하도록 하겠습니다.

 

728x90

댓글