백엔드 개발에 주로 사용하고 있는 프레임 워크들을 보면 다음과 같다.
| 프레임워크 | 언어 |
| :-: | :-: |
| Django | Python |
| Ruby on Rails | Ruby |
| Spring MVC | Java |
| Express | js |
| Laravel | PHP |
| ASP.NET | C# |
해당 프레임워크들의 공통점은 MVC 프레임워크라는 것이다.
그렇다면 왜 MVC 패턴을 사용할까?
Model
Model은 데이터와 그 데이터를 처리하는 로직을 담당한다.View
View는 사용자 인터페이스를 담당한다.Controller
Controller는 Model과 View를 연결하는 역할을 한다.Model로 전달하고 Model의 데이터를 View로 전달하여 사용자에게 보여주는 역할을 한다.
이렇게 MVC 패턴은 애플리케이션의 로직을 Model,View,Controller로 분리하여 각 구성 요소가 자신의 역할에 집중할 수 있도록 한다. 이로써 코드의 명확성이 높아지고 유지 보수가 용이해진다.
MVP, MVVM, VIP 등 여러 모델들도 있는데 왜 사용하지 않을까?에 대해 고민해보게 되었다.MVC 패턴을 이해하기 어려워졌다...
해당 자료는 Smalltalk에서 1988년에 작성한 문서에서 mvc 패턴.
view가 model을 알고 있어서 해당 정보로 화면을 구성하고 있음.

해당 자료는 cocoa에서 작성한 mvc 패턴.
view가 model을 알 수 없기 때문에 모든 작업을 controller가 처리.
둘 다 spring에서 사용하는 mvc와는 다르다.
보통 spring에서 사용하는 mvc는 JSP를 사용한 model2 MVC.
앞에 고민했던 여러 패턴들을 cocoa가 주장한 mvc 패턴에서 컨트롤러의 책임을 줄이기 위해 나온 패턴들이었다.
심지어 안드로이드에서의 MVC도 다르게 정의하기도 했다....
관심사 분리라고 생각하게 되었다.각각의 환경(spring, cocoa, android, smalltalk)에서 MVC 패턴이 조금씩 다르게 구현될 수 있지만, 이 차이는 환경의 특성과 요구 사항에 따라 정의한 결과물이라고 생각했다.Spring MVC는 서버 측 애플리케이션을 대상으로 하기 때문에, HTTP요청과 응답을 처리하는데 중점을 둔다.Cocoa나 Android에서의 MVC는 클라이언트 측 애플리케이션을 대상으로 하기 때문에 사용자 인터페이스와 사용자 입력을 처리하는데 중점을 둔다.MVC에서 가장 중요한 것은 Model,View,Controller의 역할과 책임을 이해하고, 이 구성 요소들을 적절히 분리하여 애플리케이션을 설계하는 것이다.자료를 찾아보면서 MVC와 Layered Architecture를 같게 생각하는 글들도 있어 찾아보게 되었다.
실제로 두 패턴 모두 애플리케이션의 관심사를 분리하여 코드의 재사용성을 높이고 유지보수를 용이하게 하는 것을 목표로 했다.
하지만, MVC는 사용자 인터페이스를 가진 애플리케이션을 대상으로 하고, Layered Architecture는 애플리케이션의 전체 구조를 대상으로 했다.

해당 그림이 잘 설명하고 있는데, 그림에서 주의할 것은 MVC의 model과 ModelAndView는 다른 역할을 한다.
ModelAndView는 Controller가 특정 View로 데이터를 전달하는 역할.
MVC의 model은 비즈니스 로직과 데이터를 처리하는, 그림에서는 Service Layer 이후라고 생각할 수 있다.
MVC를 3-Teir라 적혀진 글들도 봤었는데, 3-Teir는 Web Server,Web Application Server,Database같이 물리적인 요소를 구분할 때 사용한다.Layer를 단위로 구분한다.