참고자료
MVC가 제일 먼저 나왔고 MVP, MVVM 순서로 등장했다.
따라서 순서대로 살펴보겠다.
초창기에는 소스코드를 한군데에 몰아서 코드를 작성했었다. 그렇게 하다 보니 프로젝트가 커지면서 소스코드의 규모가 커지고 가독성이 떨어져 유지보수가 어려워지는 현상이 있었다. 그래서 만들어진게 MVC패턴이다.

Model-View-Controller의 약자로 애플리케이션을 세 가지 주요 구성 요소로 분리하는 디자인 패턴.
화면에 보이는 요소는 View가 담당, 데이터는 Model이 담당, 둘 사이에서 Controller가 컨트롤 해주는 디자인 패턴이다.
1) 사용자는 View를 보고 인풋
2) 들어온 인풋을 Controller가 받음
3) Controller가 인풋에 대한 처리를 진행함
4) 컨트롤러는 뷰에게 데이터를 이용해 아웃풋을 내보내라고 명령함
Controller가 너무 많은 역할을 담당해 코드가 복잡해지는 이슈가 있다.
이를 위해 나온 아이디어가 MVP패턴이다.

Model-View-Presenter 약자
화면에 보이는 요소는 View가 담당하고 버튼 레이블 포함하여 전부 가져가게 되어 사용자로부터의 인풋도 View가 받는다. 데이터는 Model이 담당.
Presenter는 화면에 어떤 내용이 보여질지만 담당한다.
1) 사용자는 View를 보고 인풋
2) View는 들어온 인풋을 Presenter에게 전달
3) Presenter는 인풋을 처리
MVC와의 차이점은 Presenter가 MVC의 Controller에서 화면만 떨어져 나간 중간관리자라는 점이다. Presenter는 View는가 어떤 요소를 보여줘야 할 지 결정만 해주고 인풋 아웃풋에 대한 모든 처리를 지니고 있지만 화면과는 상관이 없다. 따라서 View는와 Presenter가는 1:1관계로 의존성이 강하게 연결되어있다.
그런데 View의 개수가 많아지면 View를 하나 만들때마다 Presenter를 같이 만들어야했다. 비슷한 구성의 View여도 Presenter를 매번 만들어야했다. View에서 들어오는 인풋을 무조건 Presenter가 받아서 처리해야하기 때문에 View가 많으면 Presenter도 많아져서 귀찮아진다.
그래서 생겨난 패턴이 Presenter가 공통으로 처리하자는 아이디어로 생겨난 MVVM패턴이다.

1) 사용자는 View를 보고 인풋
2) View는 들어온 인풋을 ViewModel에게 전달
3) ViewModel은 인풋을 처리
여러 화면 View가 있더라도 비슷한 데이터를 가지고 있다면 ViewModel을 공유할 수 있다.
UI와 데이터 로직이 분리되어있어 관리가 쉽지만 간단한 애플리케이션에 MVVM을 적용하면 오히려 코드가 복잡해질 수 있다.
정리하자면 MVC, MVP, MVVM 중 어느 하나가 최고다가 아닌 본인의 방식, 프로젝트의 특성에 맞게 설계하면 되겠다.