MVC pattern
Model-View-Controller,MVC pattern은 사용자 인터페이스로부터 비즈니스 로직을 분리해서 application의 시각적인 요소에 변경사항이 비즈니스 로직에 영향없이 변경될 수 있도록 도와주는 패턴이다.
MVC 패턴은 Model , View , Controller로 구성되는데
- Model : application의 데이터 , bussiness logic , business rule 을 뜻한다.
*Model 을 뷰에 담을 데이터라고 한정적 정의하는 경우도 있고 (ref- https://developer.mozilla.org/ko/docs/Glossary/MVC)
dao , service 계층의 business logic 을 모두 포함해 model 이라고 하는 경우도 있습니다.
(ref - https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)
중요한 포인트는 UI와 application 비즈니스 로직을 분리시켜 서로 독립적으로 개발이 가능하도록 했다는 점입니다.
dao, service , view에 대한 명확한 계층 구분은 multi-tier architecture에서 다루고 있습니다. (ref - https://en.wikipedia.org/wiki/Multitier_architecture) - View : 사용자 인터페이스 요소 (UI)
- Controller : Model과 View 사이의 상호동작을 관리한다. 사용자의 요청에 따라 모델/뷰를 업데이트한다.
MVC 패턴 특징
- 사용자는 View 랑만 상호작용한다.
view는 모델을 보여주는 사용자 인터페이스로서 , 사용자가 view에 어떤 작업을 했을때 controller에게 사용자가 어떤 일을 했는지 알려주고, 사용자가 상황에 맞게 작업을 처리한다.
- Controller에서 Model에게 상태변경을 요청한다.
Controller는 사용자의 요청에 따라 Model을 어떤식으로 조작하는지 결정하고 처리한다.
Controller에서 View를 변경해달라고 요청할 수 있다.
View에서 Model에게 상태를 요청한다.
Model 1 Architecture , Model 2 (MVC) Architecture
- model1 과 model2(MVC)로 나뉜다.
Model 1
model1은 view에 controller logic이 섞여있다. template engine으로 jsp를 사용한다고 하면 한 jsp 페이지에서 다른 jsp 페이지로 갈때, 해당 페이지에서 controller + view 기능을 모두 하는 것이다. DB 데이터를 가져올 경우에는 JavaBean 객체, 주로 Dao (Data access object) 로부터 DB로부터 데이터를 받아, 받은 데이터를 Dto (Data transfer object, 계층간 데이터 교환을 위한 객체) 에 매핑해주어서 가져온다.
예시용 코드를 보면 view에 controller 로직이 포함되어 있음을 확인할 수 있다.
1 | // example toy code |
Model 1의 장점
- 구조가 단순하며, 정말 작은 프로젝트 수행 시 빠른 개발 속도
Model 1의 단점
- 계층간 분할 , 모듈이 세분화되어 동작하는 시스템이 아니기떄문에 테스트 코드를 짜기힘듬
- 유지보수 힘듬
UI와 controller간에 변경이 동시에 발생하지 않는다. UI만 변경될 수도 있는데, 동일한 파일에 변경되는 부분 변경되지 않는 부분만 섞여있기 때문에 유지보수가 힘들다는 것이다.
Model 2
model2는 controller , view , model을 모두 모듈화한 구조로, controller (servlet) 이 사용자 요청을 받아, 적합한 model 을 실행시키고, 데이터를 담는다 , view를 forwarding 또는 redirect 해준다.
추가로 forward와 redirect의 차이점은 다음과 같다.
- redirect : client가 재요청
- forward : 서버내부에서 view rendering 해서 client에게 보여줌 (client는 forwarding여부를 모른다.)
1 |
|
위 예제 코드처럼 controller가 사용자 요청을 받아 적합하게 model을 업데이트하고, view로 forwarding 해주는 것을 볼 수 있다.
MVC pattern의 장점
- 모듈이 세분화되어 독립적으로 개발이 가능하다
- 확장 용이성
- 유지 보수성
- model1 에 비해 코드 가독성 등
MVC pattern의 한계점
- controller가 많아질 경우 여러 controller에서 공통으로 처리해야 할 로직이 중복된다. 이러한 한계점을 보완하기 위해 나온게 front controller pattern인데, 쉽게 정리하면 여러 controller 앞단에서 동작할 main controller를 하나 두는 방식으로 spring framework에서 바로 front controller pattern을 사용하고 있다.
MVC 패턴기반의 다른 디자인 패턴
MVC 에 기반을 둔 몇 가지 다른 디자인 패턴으로는 MVVM (모델-뷰-뷰모델), MVP (모델-뷰-프리젠터), MVW (모델-뷰-왓에버) 가 있다.