Android Kotlin Fundamentals 05.1: ViewModel and ViewModelFactory 번역 #4

Task: Find problems in the stater app


이번 태스크에서는 GuessTheWorld starter app의 문제점을 찾아 봅시다.

 

  1. starter code를 실행 시켜서 Skip 또는 Got it 버튼을 누르며 게임을 진행해 보세요. 
  2. 게임 스크린은 단어와 현재 스코어를 보여 줄 것입니다. 이 때, 화면을 회전 시켜보세요. 이 때 현재 점수를 잃어 버린 것을 확인 할 수 있을 것 입니다.
  3. 이번에는 게임을 진행하다가 앱을 닫았다가 다시 열어보세요. 앱 상태가 저장되지 않아 게임이 처음부터 다시 시작 되었음을 알 수 있습니다.
  4. 현재는 End Game 버튼을 누르더라도 아무일도 일어나지 않습니다.

이 앱의 문제점

 

  • 해당 스타터 앱은 화면 회전과 같은 설정 변경 혹은 앱을 재시작 했을 때 앱의 상태를 저장하지 않습니다. onSavedInstanceState0를 통해 해당 이슈를 해결 할 수 있으나. onSavedInstanceState()는 번들에 데이터를 저장 하기 위해 추가적인 코드를 작성해야 하고 저장된 해당 데이터를 찾아야 하는 로직도 추가 해야 합니다. 그리고 저장 할 수 있는 데이터의 크기가 아주 작습니다.
  • 현재 해당 스타터 앱은 End Game 버튼을 눌러도 점수를 나타내는 화면으로 이동하지 않습니다.

해당 앱의 문제점들은 이번 강의 에서 배우는 app architecture components를 통해 해결 할 수 있습니다.

app architecture

 

앱 아키텍처 가이드  |  Android Developers

이 가이드에는 고품질의 강력한 앱을 빌드하기 위한 권장사항 및 권장 아키텍처가 포함되어 있습니다. 이 페이지는 Android 프레임워크에 기본적으로 익숙한 사용자를 대상으로 합니다. Android 앱을 처음 개발하는 경우 개발자 가이드를 확인하여 시작하고 이 가이드에서 언급된 개념을 자세히 알아보세요. 앱 아키텍처에 관심이 있고 Kotlin 프로그래밍 관점에서 이 가이드의 자료를 보려면 Udacity 과정 Kotlin을 사용하여 Android 앱 개발하기

developer.android.com

App architecture


앱 아키텍쳐는 짜여진 코드들이 특정한 시나리오 안에서 잘 동작 하도록 앱의 클래스들과 그것들의 관계를 디자인 하는 방법입니다. 이 4번에 걸친 코드랩을 통해 GuessTheWord 앱을 안드로이드 앱 아키텍쳐 가이드라인을 따라가면서 개선시켜 볼 것입니다. 이러한 과정에서 안드로이드 아키텍쳐 컴포넌트를 사용할 것 입니다. 안드로이드 앱 아키텍쳐는 MVVM 모델과 유사합니다.

 

 Android Architecture Components

 

Android 개발자  |  Android Developers

"WorkManager는 redBus 앱에서 백엔드 서버에 정보를 전달하는 방식을 단순화했습니다. 네트워크 연결, 배터리와 같은 매개변수를 처리하고 AlarmManager 또는 JobScheduler와 같은 적절한 핸들러를 사용하는 WorkManager 라이브러리의 기능을 통해 저희는 비즈니스 로직을 빌드하는 데 집중하고 WorkManager로 실행 복잡성을 줄일 수 있었습니다." 디네시 샨무감, redBus.in Android 담당자

developer.android.com

 MVVM 

 

Model–view–viewmodel - Wikipedia

Model–view–viewmodel (MVVM) is a software architectural pattern. MVVM facilitates a separation of development of the graphical user interface – be it via a markup language or GUI code – from development of the business logic or back-end logic (the data mod

en.wikipedia.org

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 컨트롤러와 뷰모델과 관련 있는 다른 안드로이드 아키텍쳐 컴포넌트를 사용하는 법에 대해 배울 것입니다.

댓글



Designed by JB FACTORY