Closed cheewr85 closed 2 years ago
MVVM 패턴을 보기전에 먼저 MVC 패턴을 알아볼 것임
여기서 MVC 패턴은 Model-View-Controller 패턴인데 어떻게 보면 가장 1차원적으로 짤 수 있는 구조임
즉, 안드로이드에서 일반적으로 그냥 매우 흔하게 구현을 할 때 행하는 것으로 볼 수 있음 좀 더 직관적으로 이야기를 하면 Activity나 Fragment가 Controller 역할을 하면서 그 안에서 View, 즉 해당 레이아웃 파일을 화면을 업데이트 하게 처리하고 그리고 Model 클래스에선 데이터 갱신을 요청하는 등 모든 역할을 함
이것은 우리가 흔히 처음 코드를 작성하고 처리할 때 하는 방식과 동일함, 각각의 패키지별로 나눠서 구분을 하지만 결국 Activity 내부에서 클릭 리스너나 View에 해당하는 리스너 처리 및 업데이트 처리 그리고 DB 같은 것을 인스턴스로 만들고 DB에 데이터를 업데이트 하는 요청을 하는 등 이런 모든 작업을 Activity에 즉, Controller에 다 담는 구조를 MVC 패턴이라고 볼 수 있음
그러면 이런 모든 작업을 Activity에서 처리하는 것이고 나머지 DB와 관련된 클래스 혹은 RecyclerView에 ViewHolder 등의 클래스만 따로 만들고 이와 관련된 작업을 모두 Controller에서 처리를 하는 패턴이라고 볼 수 있음
이 패턴은 우리가 가장 흔히 접할 수 있는 패턴이고 가장 일반적으로 만드는 방식임
하지만 이것이 만약 앱의 규모가 커지고 사이즈가 커지면 큰 문제를 야기함, 테스트라던지, 모듈화나 유연성, 유지보수에 있어서 Controller에 다 몰려있기 때문에 만약 에러가 나거나 문제가 생기면 개선을 하는데 상당히 오랜 작업이 필요함
즉, 구현은 쉽지만 기능 추가 및 변경에 있어서 유지보수가 쉽지가 않게됨
그래서 이와 같은 MVC 패턴을 쓰는 것은 구현이 쉽지만 하나의 액티비티에 모든 코드를 넣어서 개발을 하기 때문에 추후에 많은일을 담당하게 되고 결국 수정이나 유지보수가 어려워지고 스파게티 코드가 되게 됨
근데 사실 AAC와 Android Jetpack이 제대로 나오기 전에는 이런식으로 한 것이었지만 이제 Android Jetpack과 AAC를 통해서 이런 부분을 크게 개선을 할 수 있게됨, 그렇게 이를 활용해서 개선한 패턴이 MVVM 패턴임
이 부분은 코드랩 5장을 하면서 확실히 체크를 했을 것임, 기존의 MVC 패턴의 형식으로 Activity에서 처리한 모든 작업에 대해서 먼저 한 것은 Fragment가 가지고 있는 데이터와 관련된 처리하는 모든 작업에 대해서 ViewModel로 분리함으로써 Fragment는 정말 딱 UI 갱신하는 것만 남김 즉, ViewModel에서 데이터를 처리하고 이에 대해서 처리된 데이터를 viewModel을 통해 Fragment는 갱신하는 작업만 했음
그리고 Fragment.kt 뿐 아니라 데이터 바인딩을 활용 해당 xml에서도 ViewModel을 데이터로 받아서 직접 데이터에 대해서 더 간소화해서 직접적으로 View에 연결하는 상황까지 구현했음, 그래서 클릭 리스너 등 처리 역시 바로 ViewModel을 통해서 갱신을 함
여기서 LiveData도 활용함으로써 ViewModel에서 데이터 변환를 감지해서 UI 갱신에 있어서 바로바로 갱신한대로 반영이 되게끔 처리를 해 줌 이 LiveData는 Lifecycle을 인지하기 때문에 활성화되어 있을 때 UI 변경에도 반영이 되는 것임
그 다음 더 나아가서 Model의 경우 ViewModel이 요청한 데이터 즉, 5장에서처럼 단순하게 LiveData로 내부에 이미 내장되서 만든 구조가 아닌 DB 활용이나 API 호출을 통한 Model에 대해서도 데이터를 반환하여서 처리하는 것을 말함
정리하면 구현에 포커스를 맞춰서 패키지만 분리해서 쓰는 것을 MVC 패턴이라고 볼 수 있고 이를 개선하는데 있어서 ViewModel과 Data Binding 그리고 LiveData를 활용하여서 MVVM 패턴을 쓸 수 있고 더 나아가 DB 접근이나 API 통신 등 Repository 단을 추가해서 AAC의 모델로써 쓸 수 있음을 확인함
여기서 이 구조 말고 MVC에서 개선한 구조가 하나 더 있는데 바로 MVP(Model-View-Presenter)패턴임
이 구조 역시 MVC를 개선한 것인데 여기서 View와 Model을 확실하게 분리해주고 이 서로 간에 상호작용에 있어서 Presenter가 그 역할을 해줌으로써 View에 모든 것을 부여해서 처리하는 MVC 패턴을 개선함
여기서 그 구현 방식은 View와 Presenter를 연결하기 위한 인터페이스를 만들고 거기서 Model과 View를 연결해 동작을 처리하는 Presenter를 만들어서 처리하는 것임, 그러면 View 즉, Activity나 Fragment에선 이 Presenter를 불러와서 데이터 처리나 통신은 Presenter의 메소드를 활용함, 이 방식은 MVC에서 Activity에서 데이터를 불러와 그 안에서 직접 작업을 처리해서 UI를 개선하거나 메소드 작성과 별개로 단순하게 Presenter의 메소드만 쓰면 되기 때문에 UI만 처리하는 것임
하지만 그만큼 이 구조에선 View가 Prsenter에 의존적이게 될 수 밖에 없음
마지막으로 위의 구조에서 추가로 MVI 패턴이 있다, 이 패턴의 경우 MVVM 패턴을 개선한 방식임
MVI(Model-View-Intent)이 구조로 이는 단방향과 순환의 원칙을 기반으로 작동을 함, 여기서 MVVM을 개선했다는 것은 MVI의 경우 상태에 대한 것도 추가를 해 상태를 기반으로 View를 업데이트 할 수 있는 구조임
이 구조는 앞서 배운 MVC,MVP,MVVM과는 완전히 다른 구조임
그리고 이 Intent는 용어가 익숙해 보이지만 안드로이드 Intent를 말하는 것이 아님, 그냥 앱의 상태를 바꾸라는 요청을 뜻함, 이를 통해 모델은 인텐트를 통해서만 업데이트를 할 수 있는 것임
앞서 계속 봤던 Model과 ViewModel과 UI를 나눈 등 이 모든 과정은 하나의 모듈안에서 이루어지는 작업들이었음, 즉 하나의 같은 모듈에서 패키지를 나누어서 처리한 것인데 이 Clean Architecture는 아예 이를 더 모듈 단위로 나눠서 작업을 한 것임
그러면 이 구조에선 진짜 말 그대로 해당하는 레이어 계층과 그 레이어 계층 안에 클래스 그리고 해당 부분이 하는 역할에 맞는 코드만 들어가서 쓰이는 것임
이러면 다른 패키지나 클래스들이 거의 완벽히 분리되어서 돌아간다고 볼 수 있음
그리고 이렇게 분리된 모듈과 패키지들에 대해서 DI(Dependecy Injection)을 통해서 의존성 주입을 함, 이와 관련해서 다양한 DI 라이브러리를 활용해서 의존성 주입을 할 수 있음
그러면 이것이 마치 위에서 알아본 아키텍처 패턴과 같이 의존성 주입만으로 서로 영향을 주고 참조해서 쓰일 수 있음 마치 ViewModel이 Model에 있는 데이터 갱신을 요청하고 받아온 것을 View인 곳에 보여주게 하는 것처럼, 이 과정에서 View에는 viewModel만이 있고 직접 데이터 관련 로직은 ViewModel에서 처리되고 그 결과가 반영되어 UI가 업데이트 하는 것처럼 의존성 주입을 해서 분리된 레이어별로 그런식으로 활용이 될 수 있음을 의미함
[질문]
ViewModel을 쓰는데 있어서 MVVM 패턴을 적용하는데 MVVM에 좀 더 자세히 알아보고 이것을 포함해서 다른 구조인 MVC, MVP 등의 구조에 대해서 알아보면?