Android Kotlin Fundamentals 05.1: ViewModel and ViewModelFactory 번역 #4
- study
- 2019. 11. 26. 21:44
Task: Find problems in the stater app
이번 태스크에서는 GuessTheWorld starter app의 문제점을 찾아 봅시다.
- starter code를 실행 시켜서 Skip 또는 Got it 버튼을 누르며 게임을 진행해 보세요.
- 게임 스크린은 단어와 현재 스코어를 보여 줄 것입니다. 이 때, 화면을 회전 시켜보세요. 이 때 현재 점수를 잃어 버린 것을 확인 할 수 있을 것 입니다.
- 이번에는 게임을 진행하다가 앱을 닫았다가 다시 열어보세요. 앱 상태가 저장되지 않아 게임이 처음부터 다시 시작 되었음을 알 수 있습니다.
- 현재는 End Game 버튼을 누르더라도 아무일도 일어나지 않습니다.
이 앱의 문제점
- 해당 스타터 앱은 화면 회전과 같은 설정 변경 혹은 앱을 재시작 했을 때 앱의 상태를 저장하지 않습니다. onSavedInstanceState0를 통해 해당 이슈를 해결 할 수 있으나. onSavedInstanceState()는 번들에 데이터를 저장 하기 위해 추가적인 코드를 작성해야 하고 저장된 해당 데이터를 찾아야 하는 로직도 추가 해야 합니다. 그리고 저장 할 수 있는 데이터의 크기가 아주 작습니다.
- 현재 해당 스타터 앱은 End Game 버튼을 눌러도 점수를 나타내는 화면으로 이동하지 않습니다.
해당 앱의 문제점들은 이번 강의 에서 배우는 app architecture components를 통해 해결 할 수 있습니다.
App architecture
앱 아키텍쳐는 짜여진 코드들이 특정한 시나리오 안에서 잘 동작 하도록 앱의 클래스들과 그것들의 관계를 디자인 하는 방법입니다. 이 4번에 걸친 코드랩을 통해 GuessTheWord 앱을 안드로이드 앱 아키텍쳐 가이드라인을 따라가면서 개선시켜 볼 것입니다. 이러한 과정에서 안드로이드 아키텍쳐 컴포넌트를 사용할 것 입니다. 안드로이드 앱 아키텍쳐는 MVVM 모델과 유사합니다.
Android Architecture Components
GuessTheWord앱은 seperation of concern(관심사의 분리) 디자인 패턴을 따르고 있습니다. 이 패턴은 각각 다른 문제를 다루도록 클래스를 나눕니다. 첫번째 코드랩에서는 UI 컨트롤러, ViewModel, ViewModelFactory 클래스들에 대해 다뤄 보겠습니다.
관심사의 분리
Acitivty 또는 Fragment에 모든 코드를 작성하는 실수를 흔히 합니다. 이러한 UI 기반 클래스는 UI 및 운영체제 상호작용을 처리하는 로직만 포함해야 합니다. 이러한 클래스를 최대한 가볍게 유지하여 많은 수명 주기 관련 문제를 피할 수 있습니다.
Activiy 및 Fragment 구현은 소유의 대상이 아니며, Android OS와 앱 사이의 계약을 나타내도록 이어주는 클래스에 불과 합니다. 사용자 상호작용을 기반으로 또는 메모리 부족과 같은 시스템 조건으로 인해 언제든지 OS에서 클래스를 제거할 수 있습니다. 만족스러운 사용자 환경과 더욱 수월한 앱 관리 환경을 제공하려면 이러한 클래스에 대한 의존성을 최소화 하는 것이 좋습니다.
UI controller
UI controller는 액티비티나 프레그먼트와 같이 UI-based 클래스들 입니다. UI Controller는 오직 UI와 OS와 인터렉션 할 수 있는 로직들만 들어가 있어야 합니다. 예를 들어 view들을 보여주거나, 사용자의 input을 캡쳐하는 일들을 말합니다. 어떤 텍스트가 보여져야 하는지 결정하는 것과 같은 decision-making로직은 들어가면 안됩니다.
ViewModel
뷰모델은 프레그먼트 혹은 액티비티에서 보여져야 하는 데이터를 가지고 있습니다. 뷰모델은 가지고 있는 데이터로 간단한 계산이나 변형을 할 수 있습니다. MVVM 아키텍쳐에서 뷰모델은 decision-making을 수행하고 있습니다.
GameViewModel은 게임 점수, 단어 리스트, 현재 표시되어야 하는 단어 같은 데이터를 가지고 있습니다. 왜냐하면 해당 데이터들은 GameFragment에서 보여져야 하는 데이터들이기 때문입니다. GameViewModel은 간단한 계산이나 데이터의 현재 상태를 결정하는 비지니스 로직들을 가지고 있습니다.
ViewModelFactory
ViewModelFactory는 ViewModel 오브젝트들을 인스턴스화 시킵니다.
이후의 코드랩에서 UI 컨트롤러와 뷰모델과 관련 있는 다른 안드로이드 아키텍쳐 컴포넌트를 사용하는 법에 대해 배울 것입니다.