예전에 eGovFramework로 MVC 예제를 만들어 본 적은 있었지만 아직 개념이 내 것으로 되지 않은 것 같아 이번에 게시글을 작성하면서 확실히 공부해보려고 한다.

MVC 패턴 이란 애플리케이션을 개발할 때 비즈니스 로직을 분리하여 개발하는 소프트웨어 디자인 패턴이다.
MVC는 Model , View , Controller 의 약자이며, 각 모듈들은 서로의 상태를 알 수 없어야 한다.

구조를 보자마자 MVC 구조를 찾아보기가 힘들다.
우선 DispatcherServlet 이 중앙 컨트롤러라고 생각하면 된다.
HandlerMapping 에게 어떤 Controller를 쓸지 물어본다.Controller 에게 요청 처리 후 가공된 Model 을 전달받는다.Model 은 HandlerAdapter 에 의해 ModelAndView가 되어 전달된다.ModelAndView 는 View 선택에 필요한 정보를 담고 있다.ModelAndView를 통해 ViewResolver 에게 어떤 View 를 쓸지 물어본다.View 를 렌더링한다.STS 4에서 예시 MVC 프로젝트를 만들어 재현해보려고 했으나 설치과정에 충돌이 있었다.
고로 현재 사용가능한 eGovFramework 4.1에서 만든 eGovFrame Web Project 를 참고해서 따라가 보도록 하겠다.

eGovFrame Web Project 를 실행하게 되면 다음과 같은 페이지가 나온다.
여기서 Client가 등록이라는 요청을 실행한다고 해보자

그럼 다음과 같은 페이지가 나오게 된다.
이 과정에서 Client는 addSample.do라는 GET 요청을 하게 된다.
이 요청을 했을 때 어떤 일들이 벌어지는지 알아보도록 하자.
<!-- web.xml -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/egovframework/springmvc/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
첫 번째로 웹 애플리케이션이 시작될 때 가장 먼저 실행하는 web.xml 에서 설정된 dispatcher-servlet.xml로 요청이 들어가게 된다.
그럼 dispatcher-servlet.xml로 들어가보자
<!-- dispatcher-servlet.xml -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="interceptors">
<list>
<ref bean="localeChangeInterceptor" />
</list>
</property>
</bean>
dispatcher-servlet.xml을 보았을 때 HandlerMapping 구현체 중 하나인 RequestMappingHandlerMapping을 호출하는 코드를 확인할 수 있다.
RequestMappingHandlerMapping에 관련된 코드를 보려면 이 링크에서 확인 할 수 있다.
이 클래스는 Spring의 웹 모듈에 포함되어 있으며 이를 통해 Controller를 배정받게 된다.
그럼 아까 요청했던 GET 요청을 처리하는 Controller로 들어가보자
// EgovSampleController.java
@RequestMapping(value = "/addSample.do", method = RequestMethod.GET)
public String addSampleView(@ModelAttribute("searchVO") SampleDefaultVO searchVO, Model model) throws Exception {
model.addAttribute("sampleVO", new SampleVO());
return "sample/egovSampleRegister";
}
@RequestMapping 어노테이션으로 addSample.do의 GET 요청을 처리하는 메소드가 있다.
model을 addAttribute 메소드로 가공하고 뷰 이름으로 sample/eGovSampleRegister를 반환한다.
여기서 가공된 model과 반환된 뷰 이름으로 ModelAndView 객체를 만든다.
Controller 메서드가 실행 될 때 Spring의 HandlerAdapter가 실행되고 이 HandlerAdapter 를 통해 ModelAndView 객체를 만든다.
<!-- dispatcher-servlet.xml -->
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:order="1"
p:viewClass="org.springframework.web.servlet.view.JstlView"
p:prefix="/WEB-INF/jsp/egovframework/example/" p:suffix=".jsp"/>
dispatcherServlet.xml에서 ModelAndView 객체로부터 View 이름을 가져와, 등록된 ViewResolver를 사용해 실제 뷰 객체를 찾는다.
여기서는 sample/egovSampleRegister.jsp 같은 JSP 파일로 매핑된다.
결론적으로 View 객체를 이용해 Model 데이터를 View에 전달하며 최종응답을 생성하고, DispatcherServlet 은 최종 HTML을 Client에 반환한다.

이 구조를 비유하자면 이렇게 볼 수 있다.
MVC 구조를 통해 User의 요청에 따라 View를 보여주는 전체적인 구조를 식당으로 비유하겠다.
손님은 식당에서 주문(HTTP 요청)을 하고 그에 맞는 서빙된 음식(화면, View)을 ****받는다.
주방장은 모든 요청을 받아 그에 맞는 처리 과정을 거치도록 지시하는 역할을 한다.
메뉴판은 어떤 요리사(Controller)에게 주문을 전달할지 결정하도록 도와주는 역할을 한다.
주방장은 이 메뉴판을 통해 적절한 요리사(Controller)에게 작업을 배정한다.
요리사는 주방장의 명령에 따라 요청받은 음식(Model)를 만드는 역할을 한다.
재료창고(DB)에서 필요한 재료(data)를 가져와 요리(가공)하는 작업을 한다.
요리가 끝나면 태그(HandlerAdapter)로 만든 음식을 태그붙은 음식(ModelAndView)으로 만든 뒤 서빙 준비를 마친다.
서빙 규칙은 준비된 요리를 어떻게 손님에게 서빙할지 결정하는 규칙이다.
주방장이 태그붙은 음식에서 어떤 음식인지 본 다음 적절한 서빙 규칙에 따라 손님에게 서빙한다.
서빙된 음식은 최종적으로 손님에게 제공되는 음식이다.
주문이 들어오면, DispatcherServlet(주방장)은 다음과 같은 흐름으로 주문을 처리한다.
DispatcherServlet은 HandlerMapping(메뉴판)을 통해 어떤 Controller(요리사)가 주문을 처리할지 결정한다.Controller는 요리를 처리하고 필요한 데이터를 준비한 후, 이를 DispatcherServlet의 서빙파트로 전달할 준비를 마친다.DispatcherServlet은 ViewResolver(서빙 규칙)를 통해 적절한 방식으로 View 를 준비하고, 최종적으로 손님에게 제공.공부하고 찾아보면서 MVC가 어떤식으로 굴러가는지 이해가 됐지만 코드 속에서 MVC 구조를 알아볼 때 Handler라던가 Servlet 개념, web.xml 등등 추가적으로 공부해야 할 것들이 보여서 좀 흥미로웠다.
*이 글은 스터디 목적으로 공부하면서 작성한 글로, 부족한 점이나 고쳐야 할 부분이 있다면 댓글로 알려주시길 바랍니다.
https://ko.wikipedia.org/wiki/모델-뷰-컨트롤러
https://developer.mozilla.org/ko/docs/Glossary/MVC
https://velog.io/@choidongkuen/Spring-MVC-패턴에-대해-알아봅시다