채용공고를 보게되면 흔하게 볼 수 있는 디자인 패턴
어렴풋이 알고있던 디자인 패턴을 정리하기 위해 포스팅을 하게 되었다.
MVC (Model - View - Controller)
👉 사실 디자인 패턴을 모르고 안드로이드를 시작하게 되었을 때 사용하게 되는 디자인 패턴이라 생각되었다.
왜냐하면, 처음 안드로이드를 접하고 프로젝트를 진행하다보면 단순히 activity 또는 fragment에 모든 코드를 작성하는 모습을 볼 수 있다.
MVC가 하나의 Activity 또는 Fragment에 Model과 View를 정의하여 사용하는 디자인 패턴이기 때문에 그런 생각이 든 것 같았다.
Model
- application의 data
- 실제 비즈니스 로직을 처리
- database, network와 연결되어 데이터를 처리
View
- 화면에 보여지는 UI
- Model에 저장되어 있는 data를 눈으로 보이게 제공하는 역할
Controller
- View와 Model 사이의 관계를 정립하는 component
- 사용자의 action에 대한 정보를 View로부터 얻어서 필요에 따라 Model을 update
MVC의 장점
- 코드/함수 분리만 잘 해놓으면 하나의 class에 코드를 다 때려박으면 된다.
- 하나의 class에 모두 정의가 되어있으므로 누구나 쉽게 파악이 가능하다.
MVC의 단점
- 하나의 class에 모든 코드가 있기때문에 코드의 양이 많아지면 한 눈에 파악하기가 힘들다.
- view와 model의 의존성이 높기때문에 유지보수와 확장의 어려움을 겪게 된다.
- 스파게티 코드가 될 가능성이 높다.
MVP (Model - View - Presenter)
👉 View와 Model의 의존성이 높은 MVC의 단점에 대한 대안으로 나온 MVP 디자인패턴
Model
- application의 data
- 실제 비즈니스 로직을 처리
- database, network와 연결되어 데이터를 처리
View
- 화면에 보여지는 UI
- 사용자의 action을 Presenter에게 전달
Presenter
- View로부터 받은 사용자 action에 따라 행동
- Model의 data를 update하거나 View에 표시될 data를 가져와서 화면에 표시되게끔 UI 로직을 작성
MVP의 특징
- View와 Model는 서로 알지 못함 (의존성 낮춤)
- View와 Presenter, Presenter와 Model 사이에 통신하는 interface가 필요
MVP의 장점
- View, Model, Presenter가 분리되어 있어서 유지보수나 테스트하기에 용이하다.
- View와 Model의 의존성이 존재하지 않는다.
MVP의 단점
- View와 Presenter는 단일 책임의 원칙을 가지고 있어 항상 1:1로 매칭되어야 하는데, 이 원칙을 깨게되면 Presenter의 코드의 양이 많아져 거대해진다.
- 단일 책임의 원칙때문에 오히려 View와 Presenter의 의존성이 강하다.
- interface가 필요하다보니 interface를 구현하는 class도 존재하게 되어 MVC에 비해 클래스수가 많아진다.
MVVM (Model - View - ViewModel)
👉 MVC, MVP의 단점에 대한 대안으로 나온 디자인 패턴이며 livedata, databinding, viewModel과 함께 쓰이는 MVVM
사실 얼핏보면 View와 Model의 의존성이 낮은 것이 딱 MVP와 비슷해보이지만 가장 큰 차이점이 있다.
MVP는 View와 Presenter가 1:1로 매칭되어야 하지만, VIewModel과 View는 1:1일수도 있지만 1:N으로도 매칭될 수 있다!
Model
- application의 data
- 실제 비즈니스 로직을 처리
- database, network와 연결되어 데이터를 처리
View
- 사용자의 action에 대해 viewModel을 관찰(Observer)하여 화면에 표시
ViewModel
- View와 관련된 data의 흐름을 나타냄
- Model과 View 사이를 연결
MVVM의 특징
- Model과 View는 서로 알지 못한다. (의존하지 않는다.)
MVVM의 장점
- 각각의 모듈은 독립적이기 때문에 테스트 가능성이 향상된다.
- 코드의 재사용성이 증가하며, 유지보수가 쉽다
MVVM의 단점
- 작은 규모의 프로젝트에는 적합하지 않다.
- databinding이 매우 복잡해지게 되면 어플의 디버깅하는 것이 힘들다
💡 의존성을 낮춰야하는 이유
의존성(결합도)이 높다면, 하나의 클래스를 변경할 때에 다른 클래스도 함께 변경되어질 가능성이 높다.
반대로 의존성(결합도)이 낮다면, 하나의 클래스를 변경하게되어도 다른 클래스를 변경할 필요가 없어지게 된다.
참고사이트
https://www.geeksforgeeks.org/android-architecture-patterns/
'Android > note' 카테고리의 다른 글
[Android] RecyclerView의 호출 순서 (0) | 2022.03.30 |
---|---|
Uni-Directional Architecture (0) | 2022.02.24 |
firebase realtime database 데이터 삭제해도 adapter에 남아있을 때 (0) | 2022.01.22 |
[kotlin] Kakao Map API 연결 (0) | 2022.01.09 |
[android] 카카오 지도 API가 화면에 보이지 않음 (0) | 2021.11.28 |