[Android]데이터를 처리하는 Model

DWL5·2020년 7월 12일
0

현재 안드로이드 아키텍처 스터디를 하고 있습니다. 배운 내용을 정리해 보려고 합니다.

안드로이드 아키텍쳐에는 MVC, MVP, MVVM, MVI등의 패턴이 있습니다. 이를 이루는 것에 'MV'는 필수 적으로 들어가 있습니다. M이란 Model, V란 View를 의미합니다.

View는 사용자와 바로 인터렉션 할 수 있는 UI를 제공해 주는 부분입니다. 안드로이드 에서는 Activity와 Fragment등 이라고 할 수 있습니다.

안드로이드를 처음 배우고, 아키텍쳐를 적용하지 않는다고 하면 이 View단 에서 Data 관련 로직을 처리하도록 구현하기 쉽습니다. 안드로이드 개발 공식 문서에서 '책임의 분리'를 강조하고 있습니다. 이렇게 View단에 View와 상관없는 로직을 추가하는 것은 이 '책임의 분리'의 원칙에 어긋나는 것 입니다.

이번 포스팅에서는 안드로이드 아키텍처 스터디 2주차에서 Model에 대해 공부하고 반영한 내용을 정리 해보겠습니다.

Model에서 데이터 관련 로직을 처리한다고 하였습니다. 안드로이드 어플리케이션을 개발 하다보면 데이터를 서버에서 가져올 수도, 기기내부의 저장소에서도 가져올 수 있습니다. 이를 구분하기 위해 두가지 데이터 소스가 필요 합니다.

  • RemoteDataSource
  • LocalDataSource

RemoteDataSource에서는 Retrofit2같은 라이브러리를 사용하여 서버에서 데이터를 가져오는 로직이 들어 갈 수 있습니다. LocalDataSource에는 sharedPreference 혹은 Room같이 기기 내부에 저장된 데이터를 가져오는 로직이 들어 갈 수 있습니다.

각 데이터 소스에서 다른 라이브러리를 사용하는 등, 데이터를 가져오는 방법은 다를 수 있습니다. 그러나 Remote에서는 원격에서, Local은 로컬에서 데이터를 가져오는 로직이 들어가야 합니다.

그러면 어느경우에 Local에서 데이터를 가져오고, 또 어떤 경우에 Remote에서 데이터를 가져와야 하는지 판단 할까요? 이러한 로직은 Repository에서 구현 합니다. 그래서 Repository는 각 데이터소스에 대해 알고 있어야 합니다.

Repository는 적절한 데이터소스를 활용하여 데이터를 얻어와 View에 전달하는 역할을 합니다. 그렇게 되면 View는 해당 데이터가 로컬에서 온 것인지, 서버에서 온 것 인지 알 필요없이 전달된 데이터를 화면에 뿌려주기만 하면 됩니다.

저의 경우에는 해당 내용을 공부하고 과제에 도입해 보던 중 아키텍처 뿐만아니라 함수형 프로그래밍의 중요성에 대해서도 알게 되었습니다.

RemoteDataSource에서 서버에서 데이터를 가져오고나서 이를 어떻게 Repository로 전달해야 하는지 고민 하였습니다. 서버에서 데이터를 가져오는 작업은 비동기적이고, RemoteDataSource는 Repository를 가지고 있지 않았기 때문입니다.

해당 문제의 해결 방법 중 하나는 Repository에서 DataSource 쪽으로 함수를 넘겨 주는 방법이 있었습니다.

interface NaverRemoteDataSource {
    fun getMovies(q : String, success:(List<Movie.Item>) -> Unit,
    error: (Throwable) -> Unit)
}

DataSource에서는 Retrofit2 콜백을 받은 후 Repository에서 전달 받은 success 함수를 호출해 주면 됩니다.

profile
안드로이드 개발자

0개의 댓글