MVC
앱 개발을 세 개의 영역으로 분할하고 각 요소에 고유의 역할을 부여하는 방식이다.
M(Model): 데이터 영역
V(View): 사용자에게 보여지는 UI 영역
C(Controller): 비즈니스 로직 처리 영역
MVC 패턴을 도입하면 UI 영역과 도메인(비즈니스) 처리 영역이 분리되므로 서로 영향을 주지 않고
유지 보수를 할 수 있다.
디자인 패턴
MVC는 소프트웨어 디자인 패턴 중 하나이다.
소프트웨어 디자인 패턴이란, 개발 방식을 공식화한 방법론을 말한다.
과거부터 지금까지 개발하는 과정에서 발생한 공통적 문제들을 해결하는 방식이다.
디자인 패턴을 잘 활용하면 가독성과 간결성을 갖출 수 있고 설계적 측면에서도 이점이 있다.
즉, 확장성과 유지 보수가 용이하여 효육적인 소스 코드를 작성할 수 있다.
MVC의 개념
MVC는 모델, 뷰, 컨트롤러의 의미가 함축된 용어로 개발환경을 이 세가지로 분리하는 것이다.
클라이언트에게 보이는 인터페이스와 데이터 로직으로 구분하는 방법론이다.
이렇게 분리된 요소들을 MVC의 컴포넌트라고 한다.
컴포넌트
모델
모델은 앱이 무엇을 할 것인지 정의하는 역할을 수행하고
데이터 저장소와 직접 연동하여 데이터를 어떻게 처리할지 결정한다.
데이터, 규칙, 기능 등을 어떻게 활용할지 정의하는 것이 모델이다.
모델을 통해서 나온 결과 값은 컨트롤러 또는 뷰에 제공된다.
뷰
뷰는 모델로부터 받아온 데이터와 사용자가 원하는 결과값을 화면(UI)으로 보여 주는 역할을 수행한다.
우리가 웹 브랑우저를 통해 보는 것들이 보두 뷰에 해당한다.
뷰를 구현할 때 중요한 점은 뷰는 출력하는 역할만 수행해야한다.
즉, 데이터 로직을 다루면 안된다. 그래서 데이터를 저장하고 관리하는 클래스, 변수, 인스턴스 변수가 필요 없다.
컨트롤러
컨트롤러는 모델과 뷰 사이를 연결하는 다리 역할이다.
프로그램의 작동 순서나 모델에게 데이터를 어떻게 처리 혹은 가공 할지 지시하고, 받아 온 결과값을 뷰에게 전달하는 역할을 한다.
컨트롤러에는 사용자의 요청을 직접 받고 모델과 뷰를 업데이트하는 로직이 포함된다.
모델과 뷰는 다른 컴포넌트가 무슨 역할을 수행하는지 알 필요가 얼다.
하지만 컨르롤러는 뷰와 모델의 역할과 책임을 알고 있어야한다.
MVC에서 컨트롤러는 상황에 따라 여러개의 모델, 뷰와 연결될 수 있다.
MVC의 한계
MVC의 가장 큰 특징은 구성요소를 독립시킴으로써 개발 효율성을 높인다는 것이다.
이런 특징은 장점이 되기도 하지만 한편으로는 한계가 되기도 한다.
다수의 모델 또는 뷰가 하나의 컨트롤러에서 수행되기 때문에 모델과 뷰는 완전히 분리가 되기는 쉽지 않다.
특히 프로그램 구조가 커질수록 모델과 뷰가 복잡하게 연결되는 상황이 발생한다.
이런 의존성 문제를 보완하기 위해 MVC에서 다양한 패턴이 파생되었다.
그중 많이 사용되는것이 MVP, MVVM 패턴이다.
MVP
모델과, 뷰, 프레젠터(Presenter)로 구성된 디자인 패턴이다.
MVP의 특징은 뷰와 모델이 프레젠터를 통해서만 동작하도록 설계된다는 것이다.
MVC에서는 모델이 뷰로 데이터를 직접 전달하거나 뷰가 모델에서 데이터를 가져올 수 도 있었다.
하지만 MVP에서 뷰와 모델은 프레젠터를 통해서만 데이터를 교환할 수 있다.
MVVM
모델, 뷰, 뷰모델(View Model)로 구성된 디자인 패턴이다.
MVVM의 뷰모델은 모델과 뷰 사이에 위치한다.
컨트롤러, 프레젠터와 뷰 모델의 차이점은
뷰모델은 뷰에서 보일 데이터와 비즈니스로직을 가지고 있다.
버튼과 버튼을 눌렀을 때의 결과를 UI에 나타나게 하는 것이 뷰의 역할이고
버튼을 클릭했을 때 발생하는 기능은 뷰모델에서 정의한다.
이때 뷰모델의 데이터가 변경되면 뷰에서 보이는 데이터 값도 변경된다.
이를 다른말로는 데이터 바인딩이 되었다고 한다.
반대로 MVVM은 모델은 뷰와 뷰모델을 전혀 신결 쓸 필요가 없다.
단지 데이터를 어떻게 가지고 있을지만 생각하면 된다.
즉, 비즈니스 로직과 사용자에게 보여지는UI는 전혀 신결 쓸 필요가 없다.
여기서 뷰모델은 모델을 위한 역할도 한다. 뷰모델에서 데이터 변화가 일어나면 모델을 업데이트해 주는 것이다.
이와 같이 MVVM은 코드를 간략화해 준다는 장점과 로직의 은닉화라는 특징이 있다.
그리고 주고 자바스크립트, 엥귤러, Vue.js, IOS, 안드로이드 등 뷰를 요구하는 플랫폼을 개발할 때 사용된다.