안드로이드 개발자라면 MVVM이 대세라는 말들과 그에 대한 여러 정보를 어렵지 않게 많이 접해봤을 것이다.
많은 기업들이 MVVM 패턴을 사용하고 있고, 여러 채용 공고들에도 아키텍처에 대한 이해나 MVVM 실무 경험 등이 푸함되어 있기 때문이다. 그래서 오히려 무지성으로 ViewModel에 대한 이해 없이 겉핥기식 MVVM 패턴을 사용하는 사람도 많아진 것 같다.
0. ViewModel이 왜 두가지로 나뉘게 되었는가
구글이 Jetpack을 내놓기 이전부터 개발자들은 MVVM 패턴을 적용하여 개발을 하고 있었다.
그러다 구글이 Jetpack을 내놓으면서 그 당시 개발자들에겐 낯익은 ViewModel도 포함되어 있어 다들 기존의 MVVM 구조에서 사용하던 ViewModel을 구글에서 다듬어 내놨으리라 기대했지만, Jetpack의 ViewModel은 Jetpack의 아키텍처 컴포넌트에 포함되어 있는 ViewModel로, 기존 MVVM 패턴에서 사용하던 ViewModel과는 사용 목적이나 개념이 완전히 달랐다.
이에 개발자들은 헷갈리게 왜 같은 이름으로 내놨는지 의문을 가졌고, 안드로이드를 처음 접하는 사람은 AAC ViewModel 문서를 읽고 MVVM ViewModel과 혼동하여 잘못 사용하는 경우가 많아지지 않을까 염려하기도 했다. 그리고 그것은 여러 주니어 안드로이드 개발자들에게 여전히 큰 혼란을 주고 있다.
이 둘의 차이를 이해하기 위해서는 우선 각각의 개념과 구현/사용하는 목적까지 제대로 이해하는 것이 중요한데, 이 포스팅뿐 아니라 공식문서나 다른 포스팅 또한 찾아보며 확실히 이해하고 넘어가는 것을 추천한다.
1. AAC ViewModel
AAC Viewmodel은 Android Architecture Component(AAC)의 일부로,
UI와 데이터를 관리하는데에 도움을 주는 클래스이다.
UI 컴포넌트의 상태 변화에도 영향을 받지 않고 데이터를 저장하고 관리할 수 있으며, 화면 회전, 정지 등의 상황에서도 데이터를 보존할 수 있다.
그리고 LifeCycle 관리를 자동으로 수행하기 때문에 보다 간편한 구현이 가능하다.
AAC ViewModel을 사용하고 싶다면 생성자로 객체를 생성하지 말고 by viewModels 함수를 사용해서 생성해야 한다.
2. MVVM ViewModel
MVVM 패턴에서의 ViewModel은 View와 Model 사이의 중재자 역할을 수행한다.
View와 Model 사이에서 데이터를 전달/관리하며 Model로부터 받은 데이터를 View에 필요한 형태로 가공한다.
그리고 MVVM 패턴을 공부하다보면 심심치 않게 볼 수 있는 말이 있는데, "ViewModel은 View를 몰라야한다" 이다.
왜 ViewModel은 View를 몰라야 할까. 에 대해 제대로 이해하려면 우선 "관심사의 분리"에 대한 이해가 필요하다.
"관심사의 분리"란 우리가 MVVM 패턴을 사용하는 이유라고 할 수 있는데
바로 "비즈니스 로직과 프레젠테이션 로직을 UI로부터 분리한다는 것"이다.
여기서 프레젠테이션 로직은 UI에 대한 작업을 수행하는 로직을 말하며, 비즈니스 로직은 프레젠테이션 로직을 제외한 모든 로직을 의미한다.
이는 각각의 요소들이 온전히 하나의 목적만 충실히 수행하게 함으로써 구현과 유지보수, 코드의 가독성에 있어 큰 이점을 가진다.
클린 아키텍처 관점에서 보면 View와 ViewModel 둘 다 프레젠테이션 레이어에 포함되어 있지만,
View는 실제 UI에 대한 변경사항을 적용하는 로직이 들어있고, ViewModel은 도메인 레이어의 유즈케이스를 사용하여 UI와 관련된 로직에 필요한 데이터를 전달/관리하는 역할을 수행한다.
이 둘의 차이를 잘 알고 사용하는 것은 굉장히 중요하다.
본래의 쓰임새를 잘 알아야 보다 효율적인 코딩이 가능하기 때문이다.
나도 앞으로 무언가를 사용할 때 정확히 잘 알고 사용하는지에 대해 스스로 매번 되물어봐야겠다.
'개발 > Android' 카테고리의 다른 글
[안드로이드] 오픈소스 라이선스 고지 (0) | 2023.05.10 |
---|---|
[안드로이드] ViewModel에서 context를 사용하는 방법 (1) | 2023.05.10 |
[안드로이드] Glide를 알아보자 (0) | 2023.01.12 |
RxJava SubscribeOn & ObserveOn (0) | 2022.10.18 |
Repository 패턴을 사용하는 이유 (0) | 2022.09.07 |