일단 이 세 가지에 대해서 설명하기 전에, 이 패턴들이 왜 나왔는지 부터 짚고 넘어가자. 디자인 패턴이란 작업 공간에서 각 계층을 분리시킴으로 코드의 재활용성을 높이고 불필요한 중복을 막기 위해서 도입되었다. 이때 가장 많이 사용되는 패턴이 이 MVC, MVP, MVVM 패턴이고 이는 각
개발자가 Controller에 로직을 다루고, Controller는 Model을 통해 가져온 데이터를 View에게 전달한다. 여기서 View는 웹 레이어, Controller는 서버, Model은 데이터베이터베이스라고 할 수 있다. 결국 View에서는 사용자가 보는 모든 것들이 될 것이고, Controller는 사용자가 보는 뒷편 데이터베이스 앞편의 모든 것들이 될것이고, Model은 저장되는 모든 데이터들이 되는 것이다.
또 MVC에서의 COntroller는 Mdoel에게 직접적인 영향을 끼칠 수 었지만, Model은 Controller와 VIew에게 직접적인 관련은 전혀 없고, 간접적인 방식으로 전달하게 된다.
이제 Controller는 View에게 영향을 끼치지만 그 반대는 성립되지 않는다. Controller는 원하는 View를 선택하여 작용할 수 있지만 View가 Controller를 선택하여 행동할 수는 없다는 것이다. 결국 View와 Controller의 관계는 1:N 관계이며, View는 Controller에 영향을 끼칠 수 없는 관계가 된다.
그리고, MVP와 MVVM은 이 MVC 패턴에서 파생되어 나온 것이 되겠다.

MVP가 MVC에서 파생되어 나온 패턴인 만큼, 유사한 부분들이 존재 한다. Controller의 자리에 Presenter가 들어간 것 외에는 거진 다 유사한 부분이라고생각 할 수 있다. 데이터가 처리되는 순서를 살펴 보자면
이와 같은 방법으로 기능할 때, View 와 Presenter는 1:1 관계가 된다. View는 Presenter를 호출하고 presenter는 Model을 호출한다.
이와 같은 패턴 사용 시에 대부분의 책임을 Presenter와 Model이 가지고 있어 View는 출력만 하는 역할을 하게 되고, 테스트 시 View에 대한 책임이 분리되어 있기 때문에 각 요소들을 독립적으로 테스팅 할 수 있게 되며 View와 Model이 의존하는 관계를 없앨 수 있게 되었다.
하지만 단점으로 View와 presenter가 1:1 관계이기 때문에 코드의 양이 늘어나게 되고, View와 Presenter 간의 높은 의존성이라는 문제가 발생하게 된다.

이 또한도 MVC패턴과 비슷하게, Model과 View가 존재한다. 하지만 Controller 대신에 ViewModel이라는 것이 존재하게 되고, 이 ViewModel은 View를 표현하기 위해서 존재하는 Model이다. 또 View를 나타내기 위한 데이터를 처리하는 역할을 지니게 된다
데이터가 처리되는 순서를 볼 때에,
위와 같은 순서에서, Data Binding이라는 기능을 사용하게 됨으로 View와 ViewModel간의 의존성이 없게 된다. 의존성이 없기 때문에 모듈화가 가능하게 되고, 의존성을 Data Binding과 Event와 Notify로서 해결한다.

Vue.js는 이 MVVM 패턴을 기반으로 형성되었다. Vue.js에서 예제 코드 하나를 살펴보자면,
<html>
<head>
<meta charset="UTF-8"/>
<title>title here</title>
</head>
<!-- View Start-->
<body>
<div id="app">
<!-- Directive to present Data-->
</div>
</body>
<!-- View End-->
<script src="https://unpkg.com/vue" ></script>
<script>
// Model Start
let modle={
message: "hi vue.js!",
};
// Model End
// ViewModel Start (Vue Object)
let vueInstance = new Vue({
el: "#app",
data: model,
});
// ViewModel End
</script>
</html>
위의 예제에서 Vue에서 Model, ViewModel, View가 어떻게 엮여져 있는지를 잘 보여주고 있다. Model의 데이터는 ViewModel을 통헤서 View의 Directive, 즉 명령을 통해서 렌더링되어서 유저에게 보여지게 된다.
MVVM은 이정도 예제로 충분하지 않을까..?
MVC, MVP, MVVM의 각 예제들이 있지만 주로 자주 사용되는 분야들이 조금씩 틀린 것 같다. MVC는 주로 Spring으로 개발하는 쪽에서 자주 나오고, MVP는 안드로이드 개발, MVVM은 Vue 개발 사이트에서 자주 보였다. Spring, 안드로이드, Vue 개발을 하다가 MVC MVP MVVM이 나온건지 패턴의 개념적 정의가 나온 후에 각 진영에 이게 맞는것 같다 하여 패턴을 도입하기 시작한지는 알 수 없지만, 예의 패턴들이 자주 쓰이고 있고 도입할 때의 장점이 명확하기 때문에 미리미리 공부 해놓는게 좋아보인다.
또 찾아보니까 MVC가 발전한 형태은 MVC2도 있다고 하는..데… 이건 또 언제 공부한데…