돌아오신 것을 환영합니다
인터페이스를 살짝 살펴보았으니 다시 MVVM 카운터 앱으로 돌아가겠습니다
MVVM을 만들고 뷰 모델을 만들었지만 아직 모델은 없습니다
문제는 우리의 아주 아주 간단한 예제에서는 모델이 약간 이상할 것이나
이 아주 기본적인 예제로 설명 드릴 것입니다 그렇지 않으면 MVVM을
이해하기 매우 어려울 것이기 때문입니다
이제 무엇을 해야 하는 가
바로 직접
CounterViewModel과 MainActivity를 갖기 보다는 모델이 될
다른 클래스를 만들겠습니다
좋습니다
CounterModel이라고 이름
짓겠습니다
이름에 Model이라는 키워드가 들어가는데
상당히 중요합니다
이제 우리는 모델과 뷰 모델과
뷰를 담고 있는 MainActivity가 있습니다
그러므로 모델인 M과 뷰인 MainActivity인 V 그리고 뷰 모델인 VM이 되며
이 것이 MVVM의 의미입니다
이 CounterModel은 어떻게 생겼나 하면
CounterModel은 사실 데이터 클래스 입니다
아주 간단합니다
그러므로 parameter(매개변수)가 필요합니다
정수형의 count라는 매개변수를 가질 것인데
이미 끝났습니다
우리 모델은 매우 간단합니다
제가 말씀드린 것처럼 이 것이 우리가 만든 것과 같은 카운터 애플리케이션을 만든다면
이 복잡한 MVVM을 사용하는 이유로 적당하지 않습니다 UI인 MainActivity에서 로직을 사용하는 것이
얼마나 쉬운지 이미 알고 있기 때문입니다
그러나 이 예제를 통해 보여드릴 것인데 그렇지 않으면 제가 말씀드린 것처럼 이해가 어려울 것입니다
이제 모델이 생겼는데 이 모델은 상당히 많이 복잡해질 수 있습니다
별의 별 추가 정보를 가질 수 있기 때문입니다
우리 같은 경우에는 다른 것 없이 숫자만 가지는데 카운터입니다
이제 카운터 repository(저장소)를 설정합니다
repository는 클린 API처럼 동작하는 디자인 패턴이며 API는 나머지 애플리케이션의 데이터에 접근하기 위한
애플리케이션 프로그래밍 인터페이스라는 뜻입니다
Remote API와 같은 데이터 소스와 로컬 데이터베이스 그리고 인 메모리 캐시 간의 중재자라고
생각하십시오
기본적으로 우리는 어디에 있는 데이터든지 다룰 수 있는 도구를 만드는
것입니다
plug and play(플러그 앤 플레이)와 같이 말입니다
어디에서 온 것이든 상관없이 꽂는데
인터페이스에서 온 데이터건 API나 다른 웹사이트의 클라우드에서 온 데이터건
스마트폰의 데이터베이스에서 왔든
간단한 변수의 타입인 list이든 상관없이 말입니다
그리고 우리가 설정할 저장소가 중재자가 될 것입니다
기본적으로 들어오는 데이터를 변환하고 이 데이터가 어떻게 들어왔는지 이해하고
우리 애플리케이션이 작업할 수 있도록 변환 시켜 줍니다
그러면 중재자는 어떻게 생겼을까요
CounterModel클래스 안에 있을 것입니다
CounterRepository저장소를 설정하는데
private var counter가 있을 것인데 CounterModel을 사용하고
0을 할당합니다
coutner가 아니라
counter입니다
counter는 CounterModel이라는 자료형의 private 변수가 되는데
이는 우리의 모델 타입이며 이제 counter를 얻는 함수를 만듭니다
counter에 접근하고 싶으면 언제든 CounterReposityory의 getCounter 함수를
호출하면 됩니다
그러면 counter를 얻을 수 있습니다
보시는 것처럼 private 키워드 뒤에 숨어있어
접근하려면 여기서 접근해야 합니다
그리고 incrementCounter함수가 있는데 counter를
1씩 증가 시키며 이 count 변수입니다
그리고 decrementCounter에도 동일한 일을 해야 합니다
decrementCounter함수를 만들고
여기는 --입니다
뷰 모델에서 했던 것을 CounterModel에서 하고 있으며
정확히는 CounterRepository안에서 입니다
그러므로 추가 layer(계층)을 더했다고 할 수 있습니다
이는 이제 우리가 로직을 분리할 수 있다는 뜻입니다
데이터는 모두 CounterRepository안에서 관리되는데
데이터 관리 방법 등의 데이터 관련 로직 전체라고 할 수 있습니다
이제 CounterViewModel을 변경해야 하는데 왜냐하면 CounterViewModel이 이제
CounterRepository자료형의 repository가 필요하기 때문입니다
그러므로 repository를 매개변수로 넘깁니다
CounterViewModel을 repository라고 부를 CounterRepository자료형의 속성을 갖도록
설정합니다
이제 이 안의 코드는 어떻게 바꿀까요
조금만 바꾸면 됩니다
count는 이제 그저 0인 mutableStateOf가 아니라 repository.getCounter().count가
됩니다
그러면 getCounter를 이용해서 counter를 받을 수 있는데
counter는 모델이며
즉 데이터 클래스 모델이며
객체입니다
그러므로 CounterModel은 객체이고
객체는 속성을 갖습니다
그리고 우리가 접근할 속성은 count입니다
이 것이 우리가 여기서 하는 것입니다
CounterRepository인 repositort를 사용하라고 하는데 여기 있는 것이며
기본적으로 데이터를 숨기고 있으며
올바른 채널을 통해서만 접근 가능한 데 바로 이 것입니다
그렇게 count를 얻는데 뷰 모델의 private _count변수는 이제
counter에 있습니다
한 번 보면
맞습니다
이 것 또한 _counter가 되어야 합니다 이 전에도 말했듯이 여기에서도
따라야 합니다
여기는 무엇이 문제일까요
_counter.count입니다
됐습니다 가끔 편집기가 이렇습니다
이제 CounterViewModel을 다시 보겠습니다
이제 여기서 증가하는 로직을 직접 수행하는 대신에 repository의
incrementCounter함수를 사용합니다
그리고 뷰 모델의 private 변수를 설정합니다
이 값은 repository.getCounter().count입니다
decrement에도 동일하게 합니다
여기에 로직을 직접 구현하는 대신에 decrementCounter를 사용하면
되겠습니다
이 영상의 녹화를 마치다 깨달았는데
이 CounterRepository를 CounterViewModel의 매개변수로 사용하는 것은 나중에
매우 확장 가능하게 하는 법입니다
그러나 이 강의에서 현재 우리가 다루는 이 부분의 간결함을 위해
CounterViewModel안에서 직접 변수로 사용하겠습니다
이 것이 CounterRepository자료형의 repository가 되는데
이름을 다시 짓겠습니다
마우스 우클릭을 하면 Refactor에
Rename기능이 있습니다
여기 위에 있습니다
이제 CounterViewModel안의 private변수이므로 앞에
_를 붙이겠습니다
여기 이 줄이 ViewModel Factory를 만드는 것과 같은 다른
일들을 하는 많은 시간을 줄여줍니다
아니면 우리가 작업할 수 있는 저장소를 주는 외부 리소스를 실제로 가져야 할
것입니다
좋습니다
저장소가 무엇인지는 다음 영상에서 비유를 통해 조금 더 알아볼 것이고 무엇을
더 잘 할 수 있는지 보여드리겠습니다
지금은 애플리케이션을 실행해서 작동이 되는지 보겠습니다
코드를 리펙토링 하는 것은 기본적으로 더 조정할 수 있고 읽기 쉬우며 보다 작동할
준비가 되어 있게 만드는 것입니다
큰 프로젝트에서는 실제로 잘 작동하는지 수시로 테스트해야 합니다
실행해보면 여전히 작동합니다
count가 존재하는지 회전 시켜보면
여전히 3입니다
잘 작동합니다
그러면 우리 코드는 동일한 일을 합니다
보시는 것처럼 MainActivity는 아무것도 만지지 않았습니다
아무것도 할 필요가
없었습니다
모든 것이 동일합니다
우리가 한 것은 CounterViewModel이 CounterModel을 사용하도록 하여
MVVM의 M인 데이터를 다뤘습니다
그러므로 이 M(모델)이 로직을 갖습니다
이 CounterViewModel은 CounterModel에 설정한 CounterRepository자료형의
repository를 이용해 통신을 합니다
좋습니다
CounterRepository는 우리가 요리사라면 주방의 재료 구매를
맡을 것인데
다음 영상에서 보실 비유입니다
이를 통해 더 많은 것을 이해하실 수 있기를 바랍니다
다음 강의에서 뵙겠습니다