MVVM AAC LiveData 사용법(2.사용편)

이종현(JongHyunLee)
7 min readMar 14, 2019

--

해당 문서는 안드로이드 공식 문서를 기반으로 만들어졌습니다.
공식문서:
https://developer.android.com/topic/libraries/architecture/livedata?hl=ko

전편에서 LiveData에 대해 간단한 개념을 정리하는 시간을 가졌습니다.
연결되는 편이기때문에 2편을 보시기전에 1편을 먼저 보시는게 좋을 것 같습니다.

구글에서 권장하는 MVVM패턴을 이용할 것이며, AAC는 LiveData, Room, ViewModel을 사용하여 텍스트를 입력하고 출력하는 간단한 앱을 만들도록 하겠습니다.

결과화면은 아래와 같습니다.

아키택쳐 구조는 아래와 같습니다.

mvvm architecture

구글에서 권장하는 앱 아키택쳐 가이드의 링크도 남기도록 하겠습니다.
https://developer.android.com/jetpack/docs/guide?hl=ko

위 아키택쳐 가이드대로라면 LiveData는 ViewModel에서 이용되며, Repository가 Room Database에서 가져온 데이터를 객체형식으로 보유하고 있습니다.

아키택쳐 가이드의 핵심은 각 구성요소가 한 수준 아래의 구성 요소에만 종속되는것 이며, 오로지 Repository만이 여러개의 하위 구성요소를 가질 수 있습니다.

구글샘플코드를 보더라도 ViewModel이 여러개의 Repository를 가지고 있는것을 볼 수 있으며 권장사항일 뿐 따르지 않아도 되는것으로 보입니다.

Room(Model)

해당포스팅에서는 Room에 대해 간략하게 설명하고 추후에 자세한내용은 따로 포스팅 하도록 하겠습니다.

공식문서:
https://developer.android.com/topic/libraries/architecture/room?hl=ko

Room이란 안드로이드에서 공식적으로 발표한 ORM(Object Relational Mapping)중 하나로 SQLLite의 모든 기능을 활용하면서 보다 강력한 데이터베이스 액세스를 허용합니다. 추상화가 강력하며 Annotation기법이 많이 활용되었으며 반환값으로 LiveData을 이용할 수 있다는 것이 특징입니다.

Room이전에 ORM들중에 대표적으로 몇가지는 ormlite, greendao 등의 ORM등이 있었으나 현재는 Room이 가장 좋은 ORM이라고 생각합니다.

Room을 이용하기 위하여 일단 모듈수준의 gradle설정부터 해주겠습니다.

데이터를 저장할 Entity를 만들고 room table에 매핑 시켜줍니다.

Entity클래스 작성이 완료되면 스키마도 한번 만들어 봅니다.

마지막으로 Dao(data access object)만 만들어주면 Room에 관한 세팅은 끝이납니다.

ViewModel

해당포스팅에서는 ViewModel에 대해 간략하게 설명하고 추후에 자세한 내용은 따로 포스팅 하도록 하겠습니다.

공식문서: https://developer.android.com/topic/libraries/architecture/viewmodel?hl=ko

ViewModel은 MVVM(model — view — viewmodel)중의 VM에 해당하는 부분입니다. 실제 구조로만 따지면 VVMM(view — viewmodel — model)이 더 맞는표현 같지만 어감상 MVVM으로 한 것으로 보입니다.(제 추측입니다. 아시는분은 댓글 달아주시면 감사하겠습니다.)

SOC(Separation of concerns, 관심사 분리)의 개념이 강하게 들어간 MVVM에서 ViewModel의 역할은 view에서 필요한 데이터를 model에게 요청하며, 응답받은 데이터를 가공하여 view에 다시 보내주는 역할을 합니다.

개념적인 ViewModel이 아닌 AAC의 ViewModel을 이용하기 위해서는 gradle세팅이 필요합니다.

LiveData를 이용하기 위한 gradle세팅과 같습니다. 어찌보면 LiveData는 ViewModel에 종속적인 라이브러리라고 표현해도 되겠습니다.

ViewModel 클래스를 만들어줍니다.

데이터를 입력하기 위해 코루틴(coroutines)이 사용되었으며 코루틴 관련하여 향후 포스팅 하도록 하겠습니다.

Repository

MVVM에서 Repository는 데이터(Dao, Firestore, Retrofit등)를 가져오는 클래스들과 1:n 매칭이 가능한 유일한 클래스입니다. 예제에 이용되는 Repository는 InputMsgDao과 1:1 매칭이지만 구조적으로 더 늘어날 수 있다라는 것을 꼭 알아주셧으면 좋겠습니다.

저는 MVVM의 가장 핵심 패턴은 Repository Pattern이라고 생각합니다.

데이터를 입력하기 위해 코루틴(coroutines)이 사용되었으며 코루틴 관련하여 향후 포스팅 하도록 하겠습니다.

전처리 과정은 끝났으며 전체 패키지구조는 아래와 같습니다.

이제 드디어… Activity에 기능을 하나하나 추가하면서 LiveData활용법에 대해 살펴보도록 하겠습니다.

Activity는 단순히 텍스트를 입력하고 노출시켜주는 역할을 수행하며, 복잡한 로직이 들어가면 안됩니다.

Activity에서 ViewModel에 선언한 LiveData를 관찰하며 관찰결과를 바로 tv_result에 반영합니다. viewModel.inputMsgs.observe(this)에서 this는 LifecycleOwner를 가르키며 Activity와 생명주기를 공유합니다.

viewModel.livedata.observe(LifecycleOwner, Observer)

viewModel.insertMsg를 통하여 DB에 값을 입력하며, Room라이브러리는 값이 입력되면 LiveData를 최신으로 관리 해줍니다.이런 Room 라이브러리 특성을 Observable query라고하며 Room관련 포스팅을 할 때 자세히 다루도록 하겠습니다.

마무리

RxJava에 비해 지원하는 메소드는 별로 없지만 아주 간결하게 사용 가능하며 생명주기를 공유한다는 아주 큰 장점이 있겠습니다.

어쩌다보니 이번 포스팅에 LiveData보다 다른내용이 더 많이 들어가게 됬네요.

예제에는 사용되지 않았지만, MVVM은 DatabaBinding과 사용하면 아주 좋습니다.

전체 소스코드는 깃허브에 올려두도록 하겠습니다.
https://github.com/gus0000123/LiveDataSample
branch : LiveData 사용법(2.사용편)

이상 안드로이드 개발자 이종현이었습니다.
재밌게 읽으셨다면 👏🏻눌러 주시는 것도 잊지말아주세요~ 저에게 큰 힘이됩니다. :)

읽어주셔서 감사합니다~

--

--