클린 아키텍쳐와 MVVM패턴을 연결하면 유지보수성이 높아진다
근데 클린 아키텍쳐랑 MVVM이 뭔데요?
Clean Architecture (클린 아키텍쳐)
키워드는 관심사(Layer) 분리
화살표는 모듈간 의존관계를 의미 → 즉 단방향 데이터 흐름!


- 각 레이어 마다 다른 레이어와 독립적이다
- 바깥쪽 일수록 Low Level(저수준)데이터, 안쪽으로 갈 수록 추상화되고 캡슐화 된다
- 내부로 향해서만 의존 가능
- 안쪽 원은 바깥쪽 원을 알 수 없다.
- 바깥쪽 원에 선언된 이름을 안쪽에서 참조하면 안된다.
- 걍 바깥쪽 원은 어떠한 것도 안쪽에 영향을 주면 안됨!!!
(건들 ㄴㄴ!)
- [Entities]
- 가장 일반적인 비즈니스 규칙을 캡슐화하고 DTO(Data Transfer Object)도 포함하는 전사적 비즈니스 규칙
- 외부 요인으로 인해 변경 될 가능성이 가장 적음
- [Use cases]
- Intereactor라고도 하며 애플리케이션 별 비즈니스 규칙
- 데이터베이스, 공통 프레임 워크, UI 변경 사항 으로부터 분리
- [Interface Adapters (Presenters)]
- 데이터를 Entity 및 UseCase의 편리한 형식(Format) 에서 데이터베이스 및 웹에 적용 할 수있는 형식으로 변환 (레이어 간 데이터 변환)
- 이 계층에는 MVP의 Presenter, MVVM의 ViewModel 및 Repositories가 포함
- 즉 순수한 비즈니스 로직만을 담당하는 역할을 하게 됨
- [Frameworks & Drivers (웹, DB)]
- 웹 프레임 워크, 데이터베이스, UI, HTTP 클라이언트 등으로 구성된 가장 바깥 쪽 계층
- 외부 시스템과 상호작용
- UI 렌더링 및 데이터베이스 트랜잭션과 같은 이니프라 세부정보 관리
MVVM Pattern
-MVVM 패턴에서 M은 Model, V는 View, VM은 ViewModel
-쉽게 말해 V는 UI, Model은 UI가 그려지는데 필요한 데이터 혹은 UI에 표시되어야 하는 데이터
-model과 view의 사이에서 view model이 중간 다리 역할을 하여 view와 model을 분리시켜 줌

View: 사용자가 보게되는 화면인 UI
ex) Activity, Fragment…
Model: 데이터를 처리하는 역할
ex) dataClass, Repository…
View Model: View에서 표시할 데이터를 Observable 타입으로 관리하여 화면을 갱신
Live Data: 데이터가 변경될 때마다 자동적으로 알려줌
동작

- View를 통해 사용자의 action(이벤트)을 받음
- View는 ViewModel로 action 전달
- View Model에서 비지니스 로직 수행
- View Model은 Model에게 데이터 요청
- Model이 요청에 응답
- Model이 준 데이터를 View Model이 가공하여 LiveData에 저장
- View Model이 Data Binding을 통해 View 업데이트
- 요약

장점
- View 와 Model 사이에 의존성이 없음
- View 와 ViewModel 사이에도 의존성이 없어 독립적으로 모듈화 가능
- 모듈간의 의존성을 분리하면 왜 좋은데요? → 유지보수가 편함
- 중복 코드도 모듈화
- AAC 등 여러 라이브러리 접목 가능
- AAC는 또 뭔데요?

단점
- 다른 디자인 패턴에 비해 설계가 복잡(ViewModel 설계가 복잡하다,,,)
- Databinding, LiveData 등 다른 라이브러리를 필수적으로 알아야 함
MVC 도 있고 MVP도 있는데 왜 MVVM이죠?
MVC, MVP가 뭔지 모른다구요?
이 쪽으로 가시면 됩니다 →MVC / MVP

[MVC]
View와 Controller가 모두 액티비티와 프래그먼트 같은 UI에서 처리되어서 레이어 분리가 비교적 원활하지 않음
[MVP]
Presenter가 View와 1대1로 동작하므로 서로 의존성이 강해지는 문제 발생 → Presenter의 로직이 거대해짐
[MVVM]
View와 Model사이에 ViewModel을 통해 관심사를 확실히 분리
View가 리컴포지션 되더라도 ViewModel을 통해 데이터를 유지할 수 있음
(완전 슥껄하죠?)