-
반응형
안녕하세요, 하루플입니다.
MVVM에 대해 공부하면서 글을 작성해봅니다!
MVC 패턴의 장단점
기존 사용했던 MVC 패턴은 단순히 하나의 Activity와 Fragment에 코드를 전부 때려넣는 방식이었습니다. MVC는 많은 분들이 안드로이드를 처음 개발할 때 사용하게 되는 패턴이기 때문에 코드 읽기가 편하고 또 쉽게 개발할 수 있다는 장점이 가장 크다고 생각합니다.
하지만 앱의 규모가 커지면서 클래스 하나에 너무 비대한 양의 코드가 쌓이게 되고 아무리 메소드로 나누어 코드를 처리하려 해도 나중에는 읽기 힘들어 질겁니다.
이러한 스파게티 코드 문제를 해결하기 위해 나온 디자인 패턴이 MVP, MVVM 패턴입니다.
저는 회사에서 MVVM 패턴을 적용하기 때문에 여러 블로그 글을 참고하여 MVVM 패턴에 대해 작성해보려 합니다.
MVVM 디자인 패턴
MVVM 은 Model, View, ViewModel 로 구성된 디자인 패턴입니다.
View
- Activity, Fragment 가 View 역할을 담당.
- 사용자의 Action을 받는다. (텍스트 입력, 버튼 터치 등)
- ViewModel의 데이터를 관찰해(Observe) UI를 갱신한다.
- 따라서 데이터의 변화를 알아차리고 자동으로 화면을 갱신할 수 있다.ViewModel
- View가 요청한 데이터를 Model로 요청한다.
- Model로부터 요청한 데이터를 받는다.Model
- ViewModel이 요청한 데이터를 받환한다.
- DB사용이나 Retrofit을 통한 백엔드 API 호출이 보편적이다. (Repository, Database 부분)View가 필요로 하는 데이터는 ViewModel이 가지고 있고, View는 그 데이터를 필요로 하기 때문에 ViewModel이 가진 데이터를 관찰(Observing) 한다.
View가 DB에 직접 접근하는 것이 아닌 UI 업데이트에만 집중하고, ViewModel을 관찰하고 있는 만큼 데이터 변화에 더욱 능동적이다.
LiveData(Observable 패턴)을 이용해 DB를 관찰하고 자동으로 UI를 갱신한다. 직접 뷰를 바꾸어주는 번거로움을 없애고 데이터와 불일치할 확률이 줄어든다.
생명주기로부터 안전하여 메모리 누출을 방지할 수 있다. ViewModel을 통해 데이터를 참조하기 때문에 액티비티/프래그먼트의 생명주기를 따르지 않는다. 화면 전환이나 언어 변경 등 액티비티가 파괴된 후 재구성 되어도 ViewModel이 데이터를 홀드하고 있기 때문에 영향을 받지 않는다.
기능별로 모듈화되어 있어 역할 분리를 할 수 있고 뷰에대한 의존성이 전혀 없으므로 유닛 테스트에 한결 용이해진다.
AAC (Android Architecture Component)
MVVM은 훌륭하게 앱을 만들 수 있는 디자인 패턴임은 분명하지만 구조가 복잡하다는 단점이 크다.
하지만 MVVM 패턴을 간편하게 적용할 수 있도록 구글에서 AAC 라는 것을 제공한다.
다음 내용은 안드로이드 Developers 공식 사이트에 있는 글을 조금 정리한 내용입니다.
안드로이드 아키텍처 구성요소(AAC)는 테스트와 유지 관리가 쉬운 앱을 디자인하도록 돕는 라이브러리 모음이다.
앞서 MVVM패턴에서 말한것과 같이 수명주기를 관리할 수 있고, 메모리 누수를 방지하고 UI에 쉽게 데이터를 로드할 수 있다.
LiveData를 사용하여 기본 데이터베이스가 변경되면 뷰에 알리는 데이터 객체를 빌드한다.
ViewModel은 앱 회전 시 제거되지 않는 UI 관련 데이터를 저장한다.
Room은 SQLite 개체 매핑 라이브러리이다. 이것을 사용해 상용구 코드를 피하고 컴파일 시간 확인을 할 수 있고 Rx Java, Flowable, LiveData observable을 반환할 수 있다.블로그 글을 참고하여 위 이미지의 내용을 더 정리해보겠습니다.
ViewModel
앱 회전이나 언어 변경등의 앱 종료(Destroy)에도 사라지지 않는 UI를 위한 데이터를 가지고 있다. AsyncTask는 액티비티나 프래그먼트의 생명주기에서 자유로울 수 없지만, ViewModel은 View와 분리되어 있기 때문에 액티비티가 Destroy 되었다가 다시 Create 되어도 종료되지 않고 데이터를 여전히 가지고 있다.
LiveData
View가 ViewModel을 관찰할 때, 그 관찰 대상이 되는 관찰 가능한(Observable) 데이터 홀더 클래스이다. View에서 ViewModel의 LiveData를 관찰하게 되면 데이터가 변경될 때 내부적으로 자동으로 알려주게 된다. Live Data는 Activity 및 Fragment의 생명주기를 인지한다. 즉, Activity가 화면 위에 활성화되어 있을 때만 UI변경 등의 기능을 동작하게 되고, Destroy되 상태에서는 동작하지 않기 때문에 메모리 릭의 발생을 줄여준다.
Repository
ViewModel과 데이터를 주고받기 위해, 데이터 API를 포함하는 클래스다. 앱에 필요한 데이터, 즉 내장 데이터베이스나 외부 웹 서버 등에서 데이터를 가져온다. 따라서 ViewModel은 DB나 서버에 직접 접근하지 않고, Repository에 접근하는 것으로 앱의 데이터를 관리한다. Repository의 존재 덕분에 ViewModel은 데이터를 관리할 필요가 없게 된다.
RoomDatabase
SQLite 데이터베이스를 편하게 사용할 수 있도록 해주는 라이브러리이다. SQLite의 코드를 직접 작성하는 경우, 직접 테이블을 Create하거나 쿼리문을 일일이 변수를 통해 작성해주어야 했지만, Room을 쓰면 조금 더 직관적이고 편리하게 DB를 사용할 수 있다.
이 글은 아래 블로그를 참고하여 작성하였습니다.
https://blog.yena.io/studynote/2019/03/16/Android-MVVM-AAC-1.html
반응형'개발 > Android' 카테고리의 다른 글
개발자가 Git을 사용하는 이유 (1) 2022.02.12 클린코드(Clean Code) : 나쁜 코드로 치르는 대가 (0) 2022.01.30 안드로이드스튜디오 AWS Amplify 알아보기 (0) 2021.11.16 [Kotlin] 안드로이드스튜디오 뷰바인딩 (0) 2021.11.15 [코틀린/Kotlin] 오버라이딩과 추상화 (0) 2021.11.03 댓글