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, 모바일, 프론트-백 분리 구조 |
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) 등 다양한 뷰 기술 사용 가능
'복습 > Spring' 카테고리의 다른 글
[Spring 5 프로그래밍 입문] MVC 3: 세션, 인터셉터, 쿠키 (1) | 2025.07.06 |
---|---|
[Spring 5 프로그래밍 입문] MVC 1: 요청 매핑, 커맨트 객체, 리다이렉트, 폼 태그, 모델 (1) | 2025.07.06 |
[Spring 5 프로그래밍 입문] AOP 프로그래밍 (0) | 2025.07.02 |
[Spring 5 프로그래밍 입문] 빈 라이프 사이클과 범위 (1) | 2025.07.01 |
[Spring 5 프로그래밍 입문] 컴포넌트 스캔 (1) | 2025.07.01 |