과거 규칙없는 코드들로인한 가독성과 유지보수의 문제로 코드의 기능별 패턴을 나누게 되며 생기게 되었습니다.
애플리케이션의 구성 요소를 세 가지 역할(Model-View-Controller)로 구분해 개발 프로세스에서 각각의 구성 요소에만 집중해서 개발할 수 있도록 한 패턴(시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있다.)
사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴

사용자가 원하는 데이터를 모든 데이터를 담고 있어야한다.(애플리케이션의 데이터인 데이터베이스, 상수, 변수 등)
View와 Controller에 대해 어떤 정보도 알고 있으면 안된다(의존하지 않는다).
Model은 데이터를 저장하는 역할로 데이터를 가져오거나 보내는 기능수행(Getter, Setter)
시각적인 부분으로 화면을 담당한다.(Html와 같음)
필요한 데이터를 Model에서 받아온다
Model에 있는 정보를 저장하지 않으며 Controller을 통해 데이터를 요청한다
Model과 View를 연결해주는 역할
사용자의 요청에 따라 요청에 맞는 Model의 데이터를 의뢰하고 데이터를 View에 반영하여 사용자에게 알려준다.
메인 객체들의 조합을 통해 프로그램의 작동 순서나 방식을 제어합니다.
View와 Model이 각각 어떤 역할과 책임이 있는지 알고 있어야합니다.
View로부터 사용자의 action을 받아 Model에게 어떤 작업을 해야하는지 알려주거나 Model의 데이터 변화를 View에게 전달하여 View를 어떻게 업데이트할지 알려줍니다.
Model은 Controller와 View에 의존하지 않는다.(Model은 독립적인 존재로 내부에서 Controller와 View의 관련된 코드가 있으면 안된다)
View는 Model의 상태에만 의존해야하고 Contoller에는 의존하면 안된다.(5번 참조) (View내부에 Model의 상태코드만 사용할 수 있고 Controller의 코드가 있으면 안된다.)
View가 Model로부터 데이터를 받을때는, 사용자마다 다르게 보여주어야 하는 데이터에 대해서만 받아야한다.
(이름, 주소, 나이같은 것 은 Model에 있어야하고 주문받기 텍스트, 배경 색상 정보코드와같이 일관된 내용은 View내부에서만 존재해야한다)즉 View는 만들어진 ui와 모델로부터 받은 데이터가 합쳐져서 만들어진 화면이다.
Controller는 Model과 View에 의존해도 된다.(Controller내부에는 Model과 View의 코드로 중간다리역할을 한다)
View가 Model로부터 데이터를 받을 때, 반드시 Controller에서 받아야 한다.

참고자료