🍃 Spring

Spring MVC 핵심 정리: HandlerMapping · ModelAndView · ViewResolver

보배 진 2026. 1. 16. 16:28

컨트롤러가 String을 반환한다는 의미

컨트롤러는 논리적인 뷰 이름(String)을 반환한다

이 문자열은 실제 JSP 경로가 아니라

ViewResolver에 의해 실제 화면 경로로 변환된다

package com.example.controller;

public class ViewResolver {
	private String prefix;
	private String suffix;
	
	public void setPrefix(String prefix) {
		this.prefix = prefix;
	}
	public void setSuffix(String suffix) {
		this.suffix = suffix;
	}
	
	public String getView(String viewName) {
		return prefix + viewName + suffix;
		// ./ + login + .jsp
		// ./login.jsp
	}
}

 

ViewResolver 란?

컨트롤러가 반환된 논리적 뷰 이름(String)을 실제  화면 파일 경로(JSP)로 변환해주는 역할

private String prefix;
private String suffix;

화면 경로의 앞(prefix)과 뒤(suffix)

ex)

prefix = /WEB-INF/views/

suffix = .jsp

그래서 컨트롤러가 "login"을 반환하면 ➡ /WEB-INF/view/login.jsp가 반환된다

 

set 메서드 : 외부에서 설정 값을 주입받기 위한 메서드, Spring의 DI(의존성 주입)를 위한 구조

getView : 컨트롤러가 반환한 뷰 이름을 받아서 실제 JSP 경로를 만들어 반환

 

 


 

 

new를 어떻게 할 것인가

Spring에서는 직접 new를 사용하지 않고 <bean>으로 객체 생성을 위임한다

그래서 <bean>을 활용하여 new를 할 것인데

이런 코드를 작성하면 된다 <bean class="DispatcherServlet" id="ds"></bean>

여기서 DispatcherServlert은 Spring이 제공하는 서블릿이다

 

bean코드는 어디에 작성해야 될까

web.xml에 작성한다

이유는 web.xml은 서블릿 컨테이너(Tomcat)가 관리하는 설정 파일인데

모든 서블릿 및 필터 설정을 여기서 관리한다

서블릿 컨테이너 관할의 web.xml에 작성하면 된다

 

 

 

스프링에서 제공하는 서블릿 만들어줘 이름은 ds야
그 ds는 언제 호출되냐? .do할 때

 

 

 

Encodingfilter에 대한 이해

Spring에서 제공하는 CharacterEncodingFiilter를 사용하여

직접 필터 클래스를 만들 필요가 없다

인코딩 값만 파라미터로 설정하면 된다

 

 

서블릿 컨테이너 = 서블릿 관리

 

 


 

 

ds-servlet.xml의 정체

DispatcherServlet을 추가한 그 순간부터

"나 DI 해야 하는데.. 스프링 컨테이너 추가해줄래?"

pom.xml ➡ 스프링 컨테이너 있는데?

그건 니 프로젝트 거잖아

나 의존성 주입할 내거 전용 스프링 컨테이너로 파줘~~

그래서 만든 ds-servlet.xml

 

 

LoginController.java와 ModelAndView

🐰 ModelAndView 란? 🐰

스프링이 제공하는 컨트롤러를 import
ModelAndView = MAV
어디로 갈지, 뭘 데려갈지 이다

컨트롤러 처리 결과(데이터 + 화면 정보)를 담아

DispatcherServlet에게 전달하는 객체

 

ModelAndView mav = new ModelAndView();

MAV의 기본 구조는 mav를 만들어 반환하는 것이다.

 

 

🐰 ModelAndView의 구성 요소 2가지 🐰

Model(데이터)

mav.addObject("list", boardList);

▪ request.setAttribute() 역할

▪ 화면(JSP)에서 사용할 데이터

 

 

🐰 View (화면 정보) 🐰

mav.setViewName("boardList");

▪ 실제 JSP 경로 X

▪ 논리적 뷰 이름 O

 

 

 

🐰 Forward vs Redirect 🐰

Forward : JSP 이동 (데이터 전달 가능)

Redirect : .do 요청 (데이터 없음)

 

ViewResolver 기본 동작 = forward

redirect 하고 싶으면 🔽

return "redirect:/main.do";

 

메인을 할 때는 줄게 없으니까 redirect:

login 같은 JSP 이동에는 redirect: 붙이면 안 됨

 

 

 

 

 

request 대신 MAV를 쓰는 이유

ModelAndView는 POJO

request보다 가볍다 ➡ Spring MVC는 경량 구조

정리 >>  mav는 POJO 라서 가볍다 그래서 request를 안쓰고, mav를 사용한다는 것은 가볍다 == 경량화

 

 

 

ds-servlet.xml 설정 예시

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/login.do">login</prop>
            <prop key="/logout.do">logout</prop>
        </props>
    </property>
</bean>

 

▪ /login.do 요청 ➡ id="login" Controller 실행

▪ /logout.do 요청 ➡ id="logout" Controller 실행

즉, URL이 Controller Bean ID 매핑한다

 

 


Spring MVC는
DispatcherServlet이 요청을 받고 →
HandlerMapping으로 컨트롤러를 찾고 →
Controller가 ModelAndView를 반환하고 →
ViewResolver가 실제 JSP 경로를 완성한다