[Spring] Spring에서 말하는 Spring MVC 이란?


넘어가기 위해 정리하고 가자. 스프링에서 말하는 Spring MVC란?



1. Spring MVC란?

Model-View-Controller의 약자이다.

  • Model: 어플리케이션 계층의 정보, 데이터 의미
  • View: 화면 출력 로직을 담당
  • Controller: Model과 View의 연결하는 제어 로직을 담당



2. Spring MVC 처리 순서

  • Spring MVC 구성 주요 컴포넌트


mvc-s1



DispatcherServlet


  • Spring Framework가 제공하는 Servlet 클래스
  • Spring MVC의 핵심 구성 요소
  • 사용자의 Request 을 관리
  • Dispatcher가 받은 Request 을 HandlerMapping에게 위임
  • Spring에서는 front controller는 DispatcherServlet 이라고 하고 controller는 handler라고 말함


HandlerMapping


  • requestURL과 Controller 클래스의 맵핑을 관리 ( @RequestMapping )
  • HandlerMapping 인스턴스의 정보로 맵핑된 Controller에게 위임


Controller


  • 요청에 맵핑 된 Controller 위임됨 ( @Controller )
  • @RequestMapping 을 통하여 요청을 처리할 메서드에 호출
  • 필요한 비즈니스 로직을 호출
    • 해당 요청을 처리할 Service를 주입(DI)받아 Service에게 위임 ( @Service )
    • Service에서는 비즈니스 로직을 구현
    • connection pool를 담당하는 DAO가 주입(DI)받아 대신 DB에 접근한다. ( @Repository )
    • 결과 데이터를 다시 Controller에 전달
  • View에 전달 할 결과 데이터(Model)와 이동할 화면(View) 정보를 스프링 MVC가 제공하는 ModelAndView 인스턴스에 담아 DispatherServlet에 반환된다.
  • DispatherServlet는 ViewResolver에게 뷰 논리정보(View Name)를 전달


ModelAndView


  • Controller에서 처리 결과를 View에 전달 할 결과 데이터(Model)와 이동할 화면(View) 정보를 담는 클래스
  • Controller 메서드에서 리턴타입이 String이여도 핸들러에서 ModelAndView 인스턴스에 View정보를 넣는다.


ViewResolver


  • ViewResolver는 View Name를 이용해 알 맞는 view객체를 찾는다.
  • View에 model을 rendering하여 View 인스턴스를 다시 DispatherServlet에 보냄
  • DispatcherServlet은 최종 결과를 클라이언트에 응답


View


  • 결과데이터인 Model 객체를 보여한다.



3. Spring MVC 부연 설명

  • component-scan은 @Controller, @Repository, @Service, @Component 선언된 클래스를 스캔하여 빈으로 등록
<context:component-scan base-package="example">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>


  • Spring MVC가 @Controller에 요청을 보내기 위해 필요한 HandlerMapping과 HandlerAdapter를 bean으로 등록
  • Spring4 에서는 HandlerMethodArgumentResolver 설정 가능
<mvc:annotation-driven>
  • 정적 파일이 있는 경로는 DispatcherServlet 예외 처리
<mvc:resources mapping="/resources/**" location="/resources/" >


  • 스프링에서 @Autowired를 처리하기 위해 선언
<context:annotation-config/>


  • ViewResolver에는 여러가지가 있는데 기본적으로 UrlBasedViewResolver는 논리적인 뷰와 View객체 이름과 같을 때 사용하는 Resolver이다.
  • Controller에서 String으로
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:order="0"
    p:prefix="/WEB-INF/views/" p:suffix=".jsp"/>


  • ModelAndView 인스턴스에 Model과 View정보를 담는다.
  • Controller 메서드에서 리턴타입이 String이여도 핸들러에서 ModelAndView 인스턴스에 View정보를 넣는다.
// ModelAndView(Obejct) or View Name(String)
Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
try {
    // mavContainer에 View 정보 담음
    this.returnValueHandlers.handleReturnValue(
        returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
}
// ModelAndView 인스턴스에 Model과 View 정보 담음
ModelMap model = mavContainer.getModel();
ModelAndView mav = new ModelAndView(mavContainer.getViewName(), model);
if (!mavContainer.isViewReference()) {
  mav.setView((View) mavContainer.getView());
}



우리나라(?) 스프링 또는 자바 웹 프로젝트에서 또는 SI에서 많이 사용되는 스프링MVC이다. 스프링에서 확장성하고 유연성을 생각하여 @MVC 애너테이션을 활용했기 접근했기 때문에.

만약 Spring MVC 프로젝트라면 회사가 다를지어도 전체적인 구조와 흐름은 비슷하여 개발자가 파악하기에는 편할 수 있다.

전자정부 표준 프레임워크도 한 몫하는 것 같다.



참고