본문 바로가기

Android/note

[Android] Design Pattern - MVC, MVP, MVVM

채용공고를 보게되면 흔하게 볼 수 있는 디자인 패턴

어렴풋이 알고있던 디자인 패턴을 정리하기 위해 포스팅을 하게 되었다.

 

MVC (Model - View - Controller)

www.geeksforgeeks.org

 

👉 사실 디자인 패턴을 모르고 안드로이드를 시작하게 되었을 때 사용하게 되는 디자인 패턴이라 생각되었다.

왜냐하면, 처음 안드로이드를 접하고 프로젝트를 진행하다보면 단순히 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의 장점

  1. 코드/함수 분리만 잘 해놓으면 하나의 class에 코드를 다 때려박으면 된다.
  2. 하나의 class에 모두 정의가 되어있으므로 누구나 쉽게 파악이 가능하다.

MVC의 단점

  1. 하나의 class에 모든 코드가 있기때문에 코드의 양이 많아지면 한 눈에 파악하기가 힘들다.
  2. view와 model의 의존성이 높기때문에 유지보수와 확장의 어려움을 겪게 된다.
  3. 스파게티 코드가 될 가능성이 높다.

MVP (Model - View - Presenter)

www.geeksforgeeks.org

 

👉 View와 Model의 의존성이 높은 MVC의 단점에 대한 대안으로 나온 MVP 디자인패턴

 

Model

  • application의 data
  • 실제 비즈니스 로직을 처리
  • database, network와 연결되어 데이터를 처리

View

  • 화면에 보여지는 UI
  • 사용자의 action을 Presenter에게 전달

Presenter

  • View로부터 받은 사용자 action에 따라 행동
  • Model의 data를 update하거나 View에 표시될 data를 가져와서 화면에 표시되게끔 UI 로직을 작성

MVP의 특징

  1. View와 Model는 서로 알지 못함 (의존성 낮춤)
  2. View와 Presenter, Presenter와 Model 사이에 통신하는 interface가 필요

MVP의 장점

  1. View, Model, Presenter가 분리되어 있어서 유지보수나 테스트하기에 용이하다.
  2. View와 Model의 의존성이 존재하지 않는다.

MVP의 단점

  1. View와 Presenter는 단일 책임의 원칙을 가지고 있어 항상 1:1로 매칭되어야 하는데, 이 원칙을 깨게되면 Presenter의 코드의 양이 많아져 거대해진다.
  2. 단일 책임의 원칙때문에 오히려 View와 Presenter의 의존성이 강하다.
  3. interface가 필요하다보니 interface를 구현하는 class도 존재하게 되어 MVC에 비해 클래스수가 많아진다.

MVVM (Model - View - ViewModel)

www.geeksforgeeks.org

 

👉 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의 특징

  1. Model과 View는 서로 알지 못한다. (의존하지 않는다.)

MVVM의 장점

  1. 각각의 모듈은 독립적이기 때문에 테스트 가능성이 향상된다.
  2. 코드의 재사용성이 증가하며, 유지보수가 쉽다

MVVM의 단점

  1. 작은 규모의 프로젝트에는 적합하지 않다.
  2. databinding이 매우 복잡해지게 되면 어플의 디버깅하는 것이 힘들다

www.geeksforgeeks.org

 

💡 의존성을 낮춰야하는 이유

의존성(결합도)이 높다면, 하나의 클래스를 변경할 때에 다른 클래스도 함께 변경되어질 가능성이 높다.

반대로 의존성(결합도)이 낮다면, 하나의 클래스를 변경하게되어도 다른 클래스를 변경할 필요가 없어지게 된다.

 

참고사이트

https://www.geeksforgeeks.org/android-architecture-patterns/