공부한 것
MVC, MVP, MVVM, AAC
알게된 것
1. MVC
우선 가장 일반적으로 사용되는 아키텍쳐 패턴이다. Model, View, Controller 로 나뉜다.
Model
은 데이터 생성, 삭제, 갱신 등의 로직이 들어있다.View
는 사용자에게 보여지는 화면이다.Controller
는 사용자의 입력을 처리한다.
우선 사용자가 View
를 통해서 입력이 들어오고 Controller
가 이를 처리한다. 이 때 입력을 분석해서 Model
과 View
에 갱신 요청을 한다. Model
은 데이터를 갱신하고 View
는 UI
를 갱신한다. 정리하자면, Controller
는 Model
과 View
가 무엇을 해야할 지 알고 있고 이를 통제하고 있다. Controller
를 통해서 Model
과 View
가 연결되어 있으므로 서로 의존성을 띄게 된다. 안드로이드에서는 View
와 Controller
가 Activity, Fragment
에 포함되어 있다. Inflater
와 Listener
를 생각하면 된다.
장점
- 하나의 액티비티 클래스에 비즈니스 로직을 모두 담을 수 있으므로 개발을 빠르고 쉽게 진행할 수 있다.
단점
- 유지 보수가 어렵다. 또한 위에서 말했던 것처럼 뷰에서 모델을 직접 호출하므로 뷰와 모델의 의존성이 매우 높다. 따라서 테스트 코드 작성이 어려워 진다.
2. MVP
Model
과 View
의 의존성을 줄이기 위해 등장한 아키텍쳐 패턴이다. Model, View, Presenter 로 나뉘고 전체적인 느낌은 비슷하다. 하지만 Model
과 View
가 서로를 직접 참조할 수 없다. 무조건 Presenter
를 통해서만 데이터를 전달할 수 있다.
Model
은 데이터 생성, 삭제, 갱신 등의 로직이 들어있다.View
는 사용자에게 보여지는 화면이다.Presenter
은 뷰에서 요청한 정보로 모델을 가공하여 뷰에게 전달한다.
사용자가 View
를 통해서 입력이 들어오고 Presenter
가 이를 처리한다. Presenter
는 Model
에게 데이터를 요청하고 데이터를 전달받는다. 이후 가공한 데이터를 View
에 전달한다. View
는 데이터를 화면에 보여준다.
장점
- Model과 View의 의존성을 제거했다.
단점
View
와Presenter
의 의존성이 높아졌다. 또한 중복 코드가 발생할 수 있다. 예시를 들어보자. 로그인과 로그아웃은 어플의 기본 기능이 되어버렸다. 이 어플리케이션은 여러 페이지가 있고 로그인 기능의 경우 로그인 액티비티로 이동하여 로그인을 진행한다. 이 때 모든 페이지에 로그아웃 기능을 배치한다고 했을 때 모든Presenter
에 로그아웃 로직을 배치해야 한다. 어떻게 해결할 수 있을까? 중복된Presenter
를 분리한 것이 바로View Model
이다.
3. MVVM
이러한 문제점을 해결하기 위해 등장한 패턴이다. Model, View, View Model 로 나뉜다. 가장 큰 특징은 컴포넌트 분리가 정말 잘 되어 있다는 것이다. 또한 참조하는 것이 명확하다.
이를 쉽게 구현할 수 있도록 Android 에서는 Live Data
와 View Model
을 제공한다.
Model
은 데이터 생성, 삭제, 갱신 등의 로직이 들어있다.View
는 사용자에게 보여지는 화면이다.View Model
은 뷰에서 요청한 정보로 모델을 가공한다.
사용자가 View
를 통해서 입력이 들어오고 View Model
에게 명령을 한다. View Model
은 필요한 데이터를 Model
에 요청하고 데이터를 전달받는다. 이후 데이터를 가공한다. 이 때 observer
로 인해 View
가 자동으로 갱신된다.
장점
View
와Presenter
의 의존성을 제거했다. 모든 부분이 독립되어 존재하므로 모듈화를 통한 개발이 용이하다. 또한 테스트와 유지보수 또한 용이하다.
공부할 것
MVVM 프로젝트 코드 분석
느낀 점
어제, 오늘 LiveData
와 ViewModel
과 관련하여 정말 많이 찾아본 것 같다. 그래도 아직 어렵고 공부가 많이 필요하다. MVVM
이 손에 익으면 MVP
도 공부도 공부해보려고 한다.
'💻 개발 > iOS' 카테고리의 다른 글
[TIL] 22.03.22 (0) | 2022.03.22 |
---|---|
[TIL] 22.03.20 (0) | 2022.03.20 |
[TIL] 22.03.17 (0) | 2022.03.17 |
[TIL] 22.03.16 (0) | 2022.03.16 |
[TIL] 22.03.15 (0) | 2022.03.15 |