Spring MVC 란?

 

Spring에서 MVC패턴을 구성하고 구성요소들을 확장할 수 있게 만든 도구

 

 

Spring MVC 구조

주요 구성요소는 Model, View, Controller 이지만, 이들이 유기적으로 동작하기 위한 다양한 구성요소가 포함

 

  • DispatcherServlet(Front Controller)
  • HandlerMapping
  • HandlerAdapter(ControllerAdapter)
  • ModelAndView
  • ViewResolver



주요 구성요소 설명

1. DispatcherServlet (디스패처 서블릿)

  • Front Controller 역할 수행
  • 모든 HTTP 요청을 중앙에서 받고, 적절한 Controller에 위임
  • web.xml 또는 Spring Boot의 경우 @SpringBootApplication에 자동 설정됨
  • 예: localhost:8080/app/home → DispatcherServlet이 수신

Spring legacy 프로젝트에서는 xml 설정 필요

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

 

 

Spring boot 프로젝트에서는 DispatcherServlet 자동 등록

커스터마이징을 원할 땐 

 

Java config 를 통해

@Configuration
public class WebConfig {

    @Bean
    public DispatcherServlet dispatcherServlet() {
        DispatcherServlet servlet = new DispatcherServlet();
        servlet.setThrowExceptionIfNoHandlerFound(true); // 예외 처리 커스터마이징 예시
        return servlet;
    }

    @Bean
    public ServletRegistrationBean<DispatcherServlet> dispatcherServletRegistration(DispatcherServlet dispatcherServlet) {
        ServletRegistrationBean<DispatcherServlet> registration = new ServletRegistrationBean<>(dispatcherServlet, "/");
        registration.setName("dispatcherServlet");
        return registration;
    }
}

위와같이 DispatcherServlet 객체를 직접 구현이 가능

 

 

 

 

2. HandlerMapping

  • 어떤 Controller가 어떤 URL 요청을 처리할지 결정
  • @RequestMapping이나 @GetMapping, @PostMapping 등의 어노테이션 기반 매핑
@RequestMapping("/home") public String home() {
	return "homeView";
}

 

쉽게 말해서 어떤 컨트롤러의 어떤 메서드로 요청을 처리할지 결정

@RequestMapping

@GetMapping

@PostMapping

...

 

 

** @EnableWebMvc 어노테이션

Spring Framework 에서 Spring MVC 구성 요소를 명시적으로 활성화 할 때 사용

기본적으로 @Configuration 클래스에 붙여 사용

내부적으로 다양한 MVC 관련 설정(RequestMappingHandlerMapping, MessageConverter, ViewResolver 등..) 등록 가능

 

 

3. Controller

  • 클라이언트의 요청을 처리하고, 모델(Model) 데이터를 생성하고, 뷰(View) 이름을 반환
  • 비즈니스 로직은 보통 Service 계층에 위임
  • 반환 타입: 문자열(뷰 이름), ModelAndView, @ResponseBody, 등
@Controller
public class HomeController {
    @GetMapping("/home")
    public String home(Model model) {
        model.addAttribute("msg", "Hello, Spring MVC!");
        return "home";  // ViewResolver가 home.jsp로 매핑
    }
}

mvc에서 매우 자주 쓰게 되는 Contorller

 

 

4. Model (모델)

  • View로 전달할 데이터
  • Model, ModelMap, 또는 ModelAndView 객체를 통해 설정

 

But

 

@RestController + ResponseEntity 사용 방식이 더 현대적인 방식

REST API 응답에 최적화 되어있고

JSON/XML 형태로 HTTP 상태 코드, 헤더, 본문을 명확히 제어 가능

@ResponseBody를 기본 포함하거나 직접 명시

 

항목 Model & View ResponseEntity
용도 웹 페이지 렌더링 (JSP 등) REST API 응답 (JSON 등)
컨트롤러 타입 @Controller @RestController
데이터 전달 방식 Model 객체에 담아 뷰로 전달 HTTP 응답 본문에 JSON 등으로 전달
HTTP 제어 상태 코드/헤더 설정 어려움 status, headers, body 직접 제어
추천 환경 서버 렌더링 기반 웹 SPA, 모바일, 프론트-백 분리 구조
모르겠으면, 그냥 ResponseEntity 쓰자
 

5. ViewResolver

  • Controller가 "home" 같은 논리적인 뷰 이름을 반환하면
    ViewResolver가 이를 /WEB-INF/views/home.jsp와 같이 실제 물리적 파일 경로로 변환
  • MVC에서 View를 찾는 책임을 분리한 구성 요소

1. Java Config 방식

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");  // 경로 앞부분
        resolver.setSuffix(".jsp");             // 확장자
        return resolver;
    }
}

 

2. XML 설정 방식 (Spring Legacy)

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

 

 

 

** 주의할 점으로 

@RestController에서는 ViewResolver가 작동하지 않음

JSON 변환(HttpMessageConverter)이 사용됨

@Controller + @ResponseBody 조합도 마찬가지

**ViewResolver는 서버 사이드 렌더링(View 기반 응답)**에만 사용됨

 

 

6. View

  • 실제 사용자에게 보여지는 UI
  • JSP, Thymeleaf, Mustache, JSON(ResponseBody) 등 다양한 뷰 기술 사용 가능

 

+ Recent posts