지금까지 AAC에 대한 카테고리로 글을 작성한 것들이 있는데, 막상 생각해보면 AAC에 대해서 명확하게 인지하지 못하고 이것이 AAC다 라는 것만 보고 이전 글을 작성하였다.
따라서 AAC가 무엇인지, AAC에서 필자가 헷갈렸던 부분에 대해서 한번 정리하고 넘어가고자 한다.
우선,
AAC가 무엇인가 ?
AAC는 Android Architecture Components의 약자로,
테스트와 유지보수가 쉬운 앱을 디자인할 수 있도록 돕는 라이브러리의 모음이다.
쉽게 말해서 라이브러리 모음이라고 할 수 있다.
Google I/O 2017에서 새로운 라이브러리를 AAC로 묶어서 발표를 하여 AAC라는 것이 사용되게 되었고,
Google I/O 2018에서 Android Jetpack을 발표할 때는 Jetpack의 구성요소 중 하나로 AAC가 들어가 있다.
필자가 AAC에 대해 정확히 이해하지 못했을 때는, AAC와 Jetpack은 다른 것인가?라고 생각을 하였다.
17년도에 발표한 AAC에 대한 내용들은 AAC라고 부르고, Jetpack에 포함된 내용들은 AAC가 아닌 Jetpack으로 부르기도 하였기 때문에 Jetpack의 구성 요소중 하나로 AAC가 들어가 있다는 것을 명확하게 인지하지 못한 상황에서 이 두 개가 헷갈렸다.
Google I/O 2018의 발표 자료를 보면 다음과 같은 이미지를 확인할 수 있는데, 여기서 Architecture 부분이 AAC라고 볼 수 있다.
New로 붙어있는 것들이 Jetpack에서 추가된 AAC이고, 그렇지 않은 부분이 2017년도 Google I/O에서 발표된 AAC라고 생각하면 된다.
다양한 AAC 항목들 중에서, ViewModel에 대한 내용은 이미 정말 많은 사람들이 언급하고 있는 내용이지만, 필자도 해당 부분에 대하여 정확하게 모르고 사용했기 때문에 한번 더 정리를 해보려고 한다.
AAC에서 말하는 ViewModel과, MVVM 패턴에서의 ViewModel은 ViewModel이라는 이름만 같을 뿐, 전혀 다른 것이다.
MVVM 패턴에서의 ViewModel은
MVP 패턴에서 파생된 패턴으로, 비즈니스 로직과 프레젠테이션 로직을 UI로부터 분리하는 것을 목표로 사용된다. View와 Model 사이의 의존성을 없애 테스트, 유지 보수, 재사용성을 높인다.
ViewModel은 쉽게 말해서, 뷰와 모델 사이에서 데이터를 관리하고, 바인딩해주는 역할을 하게 된다.
AAC에서의 ViewModel은
안드로이드 공식 문서에 따르면 수명 주기를 고려하여 UI 관련 데이터를 저장하고 관리하도록 설계되어 있다. 화면 회전과 같이 구성을 변경할 때도 데이터를 유지할 수 있다.라고 나와있다.
화면 회전이 발생했을 때 액티비티가 종료되고 다시 생성되는 과정을 거치는데, 이때 생명 주기를 관리하여 데이터를 유실하지 않고 그대로 보존해두고 사용할 수 있게 해 준다.
간단하게 각 ViewModel에 대해 작성해 보았는데, 해당 내용만 봐도 다른 것을 알 수 있다.
AAC에서의 ViewModel은 간단하게 생각해서 LifeCycle을 관리하여 화면을 회전했을 때 데이터를 유실하지 않고 사용할 수 있게 해주는 역할.
MVVM에서의 ViewModel은 뷰와 모델 사이에서 데이터를 관리하고 바인딩해주는 역할.
로 완전히 다르다.
하지만 MVVM 패턴의 예제를 확인해보면, AAC의 ViewModel을 사용하여 구현하고 있는 모습을 볼 수 있다.
그렇다면 이것이 잘 못된 것인가?라고 생각할 수 있겠지만 그렇지 않다.
MVVM에서의 ViewModel은 그러한 역할을 하는 Class를 만들어서 구현할 수 있다.
여기서 중요한 것은, MVVM에서의 ViewModel이라고 하는 것은 그러한 역할을 하는 클래스라는 점이다.
즉, AAC의 ViewModel에 MVVM의 ViewModel이 해야 하는 역할을 준다면, AAC ViewModel이면서 MVVM의 ViewModel이 될 수 있다.
AAC의 ViewModel은 위에 말했듯이, 화면 회전과 같은 이벤트에서도 데이터가 유실되지 않고 그대로 사용할 수 있으니 오히려 더 좋은 환경에서 MVVM의 ViewModel을 만들 수 있게 되는 샘이다.
하지만, MVVM 패턴에서의 ViewModel과 AAC에서의 ViewModel의 차이점을 확실히 알고 사용해야 같이 사용했을 때 큰 어려움 없이 사용할 수 있을 것이다.
AAC의 ViewModel은 해당 액티비티에서 싱글톤으로 하나만 존재한다. 따라서, 여러 번 뷰 모델을 생성하여 사용한다고 해도, 싱글톤이기 때문에 최초에 생성한 하나의 객체만 사용하게 된다.
MVVM에서 View와 ViewModel은 1:N 관계이기 때문에 하나의 액티비티에 여러 개의 ViewModel을 사용할 수 있다.
따라서, A라는 액티비티에 AViewModel, BViewModel, CViewModel과 같이 여러 개의 ViewModel을 사용할 수 있으며, AAC ViewModel의 특성상 각 ViewModel은 싱글톤으로 생성되어 사용하게 되는 것이다.
하지만, 구글에서 권장하는 ViewModel은 하나의 액티비티에 하나의 ViewModel을 사용하고, LiveData와 여러개의 Model을 사용하여 구현하는 것을 권장하고 있으니, 개발자가 판단하여 프로젝트에 알맞게 ViewModel을 선언해서 사용하면 될 것이다.
AAC에 대한 기본적인 개념과, 필자가 헷갈렸던 Jetpack과 AAC간의 관계, AAC ViewModel과 MVVM ViewModel에 대하여 정리를 해보았다.
AAC에서 지금까지 많이 사용해왔던 ViewModel에 대하여 정확하게 모르고 사용해왔다는 점이 충격적이었고, 역시 무언가를 사용하기전에 확실하게 이해하고 사용해야겠다는 생각을 하게 되었다.
AAC ViewModel과 MVVM ViewModel은 아무리 생각해도 너무 헷갈리는 네이밍이긴 하다.
사용할 줄은 알지만, 정확히 어떠한 것인지를 모르고 사용하는 부분이 많은 것 같아 그런 부분도 다시한번 찾아서 공부를 진행해야 겠다.
'Android > AAC' 카테고리의 다른 글
[Android] AAC Navigation + BottomNavigationView 사용 방법. (0) | 2022.03.11 |
---|---|
[Android] Jetpack DataStore 실전 압축 정리 (0) | 2022.02.17 |
[Android] AAC Navigation 사용 실전 압축 정리 (0) | 2022.02.14 |
[Android] 데이터 바인딩 어댑터 (Data Binding Adapter) 사용 방법 (0) | 2022.02.07 |
[Android] Room 라이브러리 (0) | 2020.06.22 |