controller는 model을 통해서 데이터를 가져오고 그 정보를 바탕으로 시각적인 표현을 담당하는 view를 제어해서 사용자에게 전달한다.
모델은 앱이 포함해야할 데이터가 무엇인지를 정의합니다. 데이터의 상태가 변경되면 모델은 일반적으로 뷰에게 알리며 필요한대로 화면을 변경할 수 있다. 가끔 컨트롤러에게 알리기도 한다(업데이트된 뷰를 제거하기 위해 다른 로직이 필요한 경우).
뷰는 앱의 데이터를 보여주는 방식을 정의한다.
항목이 사용자게에 보여지는 방식을 정의하며, 표시할 데이터를 모델로부터 받는다.
컨트롤러는 앱의 사용자로부터의 입력에 대한 응답으로 모델 및/또는 뷰를 업데이트하는 로직을 포함한다.
예를 들어보면, 쇼핑 리스트는 항목을 추가하거나 제거할 수 있게 해주는 입력 폼과 버튼을 갖는다. 이러한 액션들은 모델이 업데이트되는 것이므로 입력이 컨트롤러에게 전송되고, 모델을 적당하게 처리한다음, 업데이트된 데이터를 뷰로 전송한다.
단순히 데이터를 다른 형태로 나타내기 위해 뷰를 업데이트하고 싶을 수도 있다(예를 들면, 항목을 알파벳순서로 정렬한다거나, 가격이 낮은 순서 또는 높은 순서로 정렬). 이런 경우에 컨트롤러는 모델을 업데이트할 필요 없이 바로 처리할 수 있다.
MVC 패턴의 장점은 널리 사용되고 있는 패턴이라는 점에 걸맞게 가장 단순하다. 단순하다 보니 보편적으로 많이 사용되는 디자인패턴이다.
사용자가 보는 페이지, 데이터처리, 그리고 이 2가지를 중간에서 제어하는 컨트롤, 이 3가지로 구성되는 하나의 애플리케이션을 만들면 각각 맡은바에만 집중을 할 수 있게 된다. 도메인을 작은 역할 단위로 분리하여 설계하는 것도 일종의 분업이라고 할 수 있지만 전체적인 구조에서도 MVC 패턴은 분업을 만들어 낼 수 있다.
서로 분리되어 각자의 역할에 집중할 수 있게끔하여 개발을 하고 그렇게 애플리케이션을 만든다면, 유지보수성, 애플리케이션의 확장성, 그리고 유연성이 증가하고, 중복코딩이라는 문제점 또한 사라지게 된다.
MVC에서 View는 Controller에 연결되어 화면을 구성하는 단위요소이므로 다수의 View들을 가질 수 있다. 그리고 Model은 Controller를 통해서 View와 연결되어지지만, 이렇게 Controller를 통해서 하나의 View에 연결될 수 있는 Model도 여러개가 될 수 있다.
View와 Model 사이의 의존성이 높다.
즉, 화면에 복잡한 화면과 데이터의 구성 필요한 구성이라면, Controller에 다수의 Model과 View가 복잡하게 연결되어 있는 상황이 생길 수 있어 유지보수가 어렵게 만들 수 있다.
MVC 규모 자체가 너무 복잡하고 비대해져서, 새 기능을 추가할때마다 의존성을 일일이 해결해야해서 메소드 분석이나 테스트도 어렵게 된다. 이런 형태의 MVC를 Massive View Controller라고 부르는데, 이는 MVC의 한계를 표현한 용어이기도 하다.
Model 은 어플리케이션이 무엇을 할 것인지를 정의. 내부 비지니스 로직을 처리하기 위한 역할을 한다.
Controller 는 모델을 어떻게 처리할 것인지를 알려주는 역할. 요청 내용을 분석해서 모델과 뷰에 업데이트 요청을 한다.
View 는 화면에 어떤걸 보여주기 위한 역할. 모델이나 컨트롤러가 보여주려고 하는 것들을 보여준다.
장점은 페이지, 데이터 처리, 중간에서 제어하는 컨트롤. 이 3가지로 구성해 하나의 애플리케이션을 만들면 분업을 만들어 낼 수 있어 각각 맡은바에 집중할 수 있게된다. 이렇게 서로 분리되어 각자의 역할에 집중할 수 있다면 유지보수, 확장성, 유연성이 증가한다.
유지보수 : 이미 구축되어진 시스템을 운영 및 관리.
확장성 : 비즈니스 요구에 맞도록 시스템을 확장하는 기능.
유연성 : 상황, 이용자환경, 권한 등에 따른 효율적 업무 분산과 집중을 의미.
단점은 Massive View Controller가 될 수 있다. 복잡한 화면과 여러 데이터의 구성 필요한 경우 컨트롤러를 통해 하나의 뷰에 연결될 수 있는 모델이 여러개가 되어 뷰와 모델 사이의 의존성이 높아져 새로운 기능을 추가하거나 수정할 때 의존성을 일일이 해결해야돼서 유지보수와 테스트가 어렵게 된다.
https://ko.wikipedia.org/wiki/%EB%AA%A8%EB%8D%B8-%EB%B7%B0-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC
https://m.blog.naver.com/jhc9639/220967034588
https://developer.mozilla.org/ko/docs/Glossary/MVC
https://beomy.tistory.com/43
https://medium.com/@jang.wangsu/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-mvc-%ED%8C%A8%ED%84%B4%EC%9D%B4%EB%9E%80-1d74fac6e256
https://velog.io/@ljinsk3/MVC-%ED%8C%A8%ED%84%B4