16. 스프링 MVC 기능

스프링 프레임워크 MVC의 구성 요소와 요청 처리 흐름을 다룬다.


1. 스프링 MVC의 특징

스프링 프레임워크에서 지원하는 MVC 기능의 주요 특징은 다음과 같다.

특징설명
모델2 아키텍처요청 처리·비즈니스 로직·화면을 분리
모듈 연계 용이스프링의 DI, AOP 등 다른 모듈과 자연스럽게 통합
태그 라이브러리메시지 출력, 테마 적용, 입력 폼 구현을 간편하게 지원

2. MVC 구성 요소

구성 요소역할
DispatcherServlet모든 요청을 받아 적절한 컨트롤러에 전달하고, 결과를 View에 전달
HandlerMapping요청 URL에 매핑되는 컨트롤러를 찾아 반환
Controller요청을 처리하고 결과를 ModelAndView로 반환
ModelAndView처리 결과 데이터와 View 이름을 함께 저장
ViewResolverView 이름을 실제 View 객체(JSP 등)로 변환
View최종 화면을 생성하여 클라이언트에 응답
  스프링 MVC 구성 요소 관계

  ┌─────────────────┐
  │DispatcherServlet│
  └──┬──┬──┬──┬─────┘
     │  │  │  │
     │  │  │  └→ View
     │  │  └→ ViewResolver
     │  └→ Controller
     └→ HandlerMapping

3. MVC 요청 처리 흐름

  ① 브라우저 요청
        │
        ▼
  ┌─────────────────┐
  │DispatcherServlet│
  └───────┬─────────┘
          │ ② 컨트롤러 조회
          ▼
  ┌─────────────────┐
  │ HandlerMapping  │
  └───────┬─────────┘
          │ ③ 처리 위임
          ▼
  ┌─────────────────┐
  │   Controller    │
  │ (비즈니스 로직)  │
  └───────┬─────────┘
          │ ④ ModelAndView
          ▼
  ┌─────────────────┐
  │DispatcherServlet│
  └───────┬─────────┘
          │ ⑤ View 이름 전달
          ▼
  ┌─────────────────┐
  │  ViewResolver   │
  └───────┬─────────┘
          │ ⑥ View 반환
          ▼
  ┌─────────────────┐
  │      View       │
  │ (JSP 등 화면)    │
  └───────┬─────────┘
          │ ⑦ 응답 생성
          ▼
  ┌─────────────────┐
  │DispatcherServlet│
  └───────┬─────────┘
          │ ⑧ 최종 응답
          ▼
      브라우저

단계별 설명

단계동작
브라우저가 URL로 DispatcherServlet에 요청
HandlerMapping에서 매핑된 컨트롤러 조회
매핑된 Controller에 처리 위임
Controller가 결과와 View 이름을 ModelAndView에 담아 반환
DispatcherServlet이 View 이름을 ViewResolver에 전달
ViewResolver가 해당 View 객체를 반환
View가 화면을 생성하여 DispatcherServlet에 전달
DispatcherServlet이 최종 응답을 브라우저에 전송
DispatcherServlet프론트 컨트롤러(Front Controller) 패턴의 구현체다. 모든 요청이 하나의 진입점을 거치므로 공통 처리(인코딩, 로깅, 인증 등)를 한 곳에서 관리할 수 있다.

4. 간단한 스프링 MVC 예제

web.xml — DispatcherServlet 등록

<web-app ...>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>
            org.springframework.web
            .servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

dispatcher-servlet.xml — 빈 설정

<beans ...>
    <!-- HandlerMapping -->
    <bean id="handlerMapping"
      class="org.springframework.web.servlet
             .handler.BeanNameUrlHandlerMapping"/>

    <!-- Controller -->
    <bean name="/hello.do"
        class="com.spring.HelloController" />

    <!-- ViewResolver -->
    <bean id="viewResolver"
      class="org.springframework.web.servlet
             .view.InternalResourceViewResolver">
        <property name="prefix"
            value="/WEB-INF/views/" />
        <property name="suffix"
            value=".jsp" />
    </bean>
</beans>

Controller 작성

public class HelloController
    extends AbstractController {

    @Override
    protected ModelAndView handleRequestInternal(
            HttpServletRequest request,
            HttpServletResponse response)
            throws Exception {

        ModelAndView mav = new ModelAndView();

        // View 이름 설정
        mav.setViewName("hello");

        // 모델 데이터 추가
        mav.addObject("message", "스프링 MVC!");

        return mav;
    }
}

hello.jsp — View

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<body>
    <h1>${message}</h1>
</body>
</html>

요청 흐름 추적

  /hello.do 요청 시

  DispatcherServlet
       │
       ▼
  BeanNameUrlHandler
  Mapping
  → "/hello.do" 매핑
       │
       ▼
  HelloController
  → ModelAndView
    viewName: "hello"
    model: {message: ...}
       │
       ▼
  InternalResource
  ViewResolver
  → /WEB-INF/views/
    hello.jsp
       │
       ▼
  hello.jsp 렌더링
  → 브라우저 응답
DispatcherServlet의 설정 파일 이름은 기본적으로 {servlet-name}-servlet.xml이다. 위 예제에서 servlet-name이 dispatcher이므로 dispatcher-servlet.xml을 자동으로 찾는다. 이름이 다르면 contextConfigLocation 파라미터로 명시해야 한다.

5. ViewResolver의 prefix/suffix 동작

InternalResourceViewResolver는 Controller가 반환한 View 이름에 prefixsuffix를 붙여 실제 JSP 경로를 만든다.

설정
prefix/WEB-INF/views/
suffix.jsp
View 이름hello
실제 경로/WEB-INF/views/hello.jsp
  ViewResolver 경로 조합

  prefix    + viewName + suffix
  /WEB-INF/   hello      .jsp
  views/

  → /WEB-INF/views/hello.jsp
JSP를 /WEB-INF/ 아래에 두면 브라우저에서 직접 접근할 수 없다. 반드시 Controller를 거쳐야만 화면이 보이므로 보안상 권장되는 구조다.

요약

개념한 줄 정리
DispatcherServlet모든 요청의 진입점 (프론트 컨트롤러)
HandlerMappingURL → Controller 매핑
Controller비즈니스 로직 처리, ModelAndView 반환
ModelAndView처리 결과 + View 이름 저장
ViewResolverView 이름 → 실제 JSP 경로 변환
View최종 화면 생성

모델2 vs 스프링 MVC 비교

구분모델2스프링 MVC
프론트 컨트롤러직접 서블릿 작성DispatcherServlet 제공
URL 매핑web.xml에 직접 설정HandlerMapping이 자동 처리
뷰 연결RequestDispatcher로 직접 포워드ViewResolver가 자동 처리
데이터 전달request.setAttribute()ModelAndView.addObject()