프레임워크 뷰(Vue)를 사용하면 컨트롤러(Controller)가 뷰(View)를 갱신하는 것이 아니라, 뷰(View)가 모델(Model)의 변화를 감지하고 바로 화면을 갱신해 버린다. 이것도 모델-뷰-컨트롤러(MVC) 구조라고 볼 수 있을까? 구글에 ‘MVC 패턴’ 을 검색하면 수많은 자료들을 찾아볼 수 있다. 그런데 문제는 해석이 저마다 제각각이라는 것이다. 특히 뷰(View)와 모델(Model) 사이의 관계에 대한 해석이 그러하다. 우선 어떤 해석들이 있는지 간략히 살펴보자.

그림(참고1) : 위키백과. 뷰와 모델은 서로 직접 상호작용하지 않는다.

Untitled

그림(참고2) : 우아한 테크코스 발표자료. 뷰와 모델은 서로 직접 상호작용하지 않는다. 컨트롤러가 모델에게 데이터를 받아 직접 뷰를 통제한다.

Untitled

그림(참고3) : 생활코딩의 MVC 수업자료. 뷰와 모델은 서로 직접 상호작용하지 않는다. 컨트롤러가 모델에게 데이터를 받아 직접 통제한다.

Untitled

그림(참고4) : 팀노바의 MVC 설명자료. 뷰는 모델의 변화를 감지하고 직접 값을 읽어간다.

Untitled

그림 : 페이스북의 Flux 발표자료. 뷰는 컨트롤러와 별개로 모델과 상호작용한다.

Untitled

이 논의를 통해 질문에 내릴 수 있는 답은 다음과 같다. 프레임워크를 이용해 MVC를 구현할 때 패턴이 구체화되는 형태는 조금씩 다르다(참고8). 만약 프레임워크가 뷰(Vue)라면 컨트롤러의 개입 없이 뷰가 모델의 변화를 감지하고 자동으로 화면을 갱신하여 둘은 직접 상호작용한다고 볼 수 있다. 데이터를 바인딩하는 것이 일반적이기 때문에, 뷰(View)와 데이터를 분리시키려는 행위는 오히려 부자연스럽다(from2). 하지만 CI(Codelgniter)와 같은 프레임워크에서는 모델(Moel)과 뷰(View) 둘은 직접 상호작용하지 않고 컨트롤러가 중간에서 모든 것을 매개해주어야 한다(참고1,2,4,5,6). 따라서 모델-뷰-컨트롤러(Model-View-Controller (MVC)) 패턴에서 모델(Model)과 뷰(View)의 관계는 엄밀하게 정의되지 않는다는 것을 알 수 있다. 뷰는 컨트롤러와만 소통하기도 하고, 뷰가 모델과 직접 소통하기도 한다(참고5,6:위키백과. 이럴수도 저럴수도 있다는 것을 말하고 있다. 하나의 문서에서도 의견이 갈린다)(참고7:배달의민족).

MVC라는 컨셉의 노이즈 속에서 남겨지는 본질은 (1) 모델-뷰-컨트롤러가 분리되어 있고, (2) 컨트롤러가 중앙에서 모델을 통제한다는 것이다. 뷰와 모델이 직접 상호작용해서는 안된다는 “엄밀한 MVC” 원칙은 프론트엔드 프레임워크가 편의를 위해 양방향 데이터 바인딩을 지원하면서 무너졌기 때문이다.


MVC 패턴을 그려낸 어떤 그림에서는 뷰와 모델 사이에는 직접적인 데이터 통신이 일어나지 않고 있고, 어떤 그림에서는 직접적으로 상호작용을 하다 보니 MVP 패턴이 등장했다는 이야기가 나오는데 도대체 뭐가 맞는거지?!

어떤 그림에서는 사람이 뷰와 상호작용하고 어떤 그림에서는 사람이 컨트롤러와 상호작용하는데 도대체 뭐야 망할!


parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료들.

  1. 4:00, 뷰모델(view model)은 데이터가 변경될 때마다 즉시 뷰에 반영된다. 이것이 MVVM에서 말하는 VM의 역할이다.
  2. 25:00, 사용자가 화면의 버튼을 클릭한다는 것은 뷰를 마주하고 있다는 것이다. 그런데 MVC 모델에서는 뷰가 직접 처리하는 것이 아니고 컨트롤러에 그 입력정보를 컨트롤러에게 넘긴다.