컨트롤러가 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 경로를 완성한다
'🍃 Spring' 카테고리의 다른 글
| Command 객체 생성 방식으로 DAO를 new하면 안 좋은 이유 (0) | 2026.01.19 |
|---|---|
| 왜 Spring Boot는 가벼운가? MVC 구조 변화로 이해하기 (JSP/서블릿 MVC → Spring MVC → Spring Boot) (0) | 2026.01.19 |
| Spring Boot 404 에러 해결: @GetMapping를 붙여보자 (0) | 2026.01.16 |
| 복습 겸 스프링 구조 이해해보기 (0) | 2026.01.16 |
| 스프링 컨테이너의 구조 (0) | 2026.01.15 |