오늘도 더 나은 코드를 작성하였습니까?

ViewModel 개요 본문

Android Jetpack Architecture/ViewModel

ViewModel 개요

hik14 2020. 8. 18. 16:03

ViewModel 클래스는 수명 주기를 고려하여 UI 관련 데이터를 저장하고 관리하도록 설계되었다.

ViewModel 클래스를 사용하면 화면 회전과 같이 구성을 변경할 때도 데이터를 유지할 수 있습니다.

 

Android 프레임워크는 Activity/Fragment 와 같은 UI 컨트롤러의 수명 주기를 관리합니다. 프레임워크는 특정 사용자 작업이나 완전히 통제할 수 없는 기기 이벤트에 대한 응답으로 UI 컨트롤러를 제거하거나 다시 만들도록 결정할 수 있습니다.

 

시스템에서 UI 컨트롤러를 제거하거나 다시 만들면 컨트롤러에 저장된 일시적인 모든 UI 관련 데이터가 손실됩니다.

예를 들어 앱은 Activity중 하나에 사용자 목록을 포함할 수 있습니다.

구성 변경을 위해 Activity를 다시 생성하면 새 활동은 사용자 목록을 다시 가져와야 합니다. 데이터가 단순한 경우 활동은 onSaveInstanceState() 메서드를 사용하여 onCreate()의 번들에서 데이터를 복원할 수 있습니다.

 

하지만 이 접근 방법은 사용자 목록이나 비트맵과 같은 대용량일 가능성이 높은 데이터가 아니라, 직렬화했다가 다시 역직렬화할 수 있는 소량의 데이터에만 적합합니다.

 

또 다른 문제는 UI 컨트롤러가 반환하는 데 시간이 걸릴 수 있는 비동기 호출을 자주 해야 한다는 점입니다.

UI 컨트롤러는 이러한 비동기 호출을 관리해야 하며, 메모리 누출 가능성을 방지하기 위해 시스템에서 호출 폐기 후 호출을 정리하는지 확인해야 합니다. 이러한 관리에는 많은 유지보수가 필요하며,

구성 변경 시 객체가 다시 생성되는 경우 객체가 이미 실행된 호출을 다시 해야 할 수 있으므로 리소스가 낭비됩니다.

 

Activity/Fragment와 같은 UI 컨트롤러는 주로 UI 데이터를 표시하거나, 사용자 작업에 반응하거나, 권한 요청과 같은 운영체제 커뮤니케이션을 처리하기 위한 것입니다

 

UI 컨트롤러에 데이터베이스나 네트워크에서 데이터 로드를 담당하도록 요구하면 클래스가 팽창됩니다. UI 컨트롤러에 과도한 책임을 할당하면 단일 클래스가 다른 클래스에 작업을 위임하지 않고 홀로 모든 앱 작업을 처리하려고 할 수 있습니다. 또한 이런 방법으로 UI 컨트롤러에 과도한 책임을 할당하면 테스트가 훨씬 더 어려워집니다.

 

UI 컨트롤러 로직에서 뷰 데이터 소유권을 분리하는 방법(ViewModel 생성)이 훨씬 더 쉽고 효율적입니다