본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다.
'스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술'
뷰 리졸버(View Resolver)
먼저 핸들러 매핑과 핸들러 어댑터를 통해 핸들러를 실행한 이후, 핸들러(컨트롤러)가 처리하고 ModelAndView를 반환한다.
이후 ModelAndView를 알맞은 View로 전달하기 위해 DispatcherServlet에 의해 뷰 리졸버가 호출된다.
즉, 뷰 리졸버는 ModelAndView 객체를 View 영역으로 전달하기 위해 알맞은 View 정보를 설정하는 역할을 한다.
뷰 리졸버 활용 예제
OldController.java
@Component("/springmvc/old-controller")
public class OldController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("OldController.handleRequest");
return new ModelAndView("new-form");
}
}
위 코드는 스프링 MVC의 Controller 인터페이스의 구현체 핸들러(컨트롤러)이다.
- 별다른 로직을 수행하지 않으며, ModelAndView 객체를 반환한다.
- ModelAndView에는 “new-form”이라는 문자열 데이터를 포함하고 있다.
new-form.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="save" method="post">
username: <input type="text" name="username" />
age: <input type="text" name="age" />
<button type="submit">전송</button>
</form>
</body>
</html>
위 코드는 뷰 리졸버가 찾아서 설정할 실제 View이다.
해당 코드 파일의 위치가 “webapp/WEB-INF/views/”에 위치하고 있다고 가정한다.
프로젝트를 실행 후 http://localhost:8080/springmvc/old-controller에 접속하면 Whitelabel Error Page 오류가 발생할 것이다.
application.properties
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
위 코드를 application.properties에 추가하여 다시 실행하면 해당 View가 정상적으로 반환될 것이다.
뷰 리졸버 - InternalResouceViewResolver
스프링 부트는 InternalResouceViewResolver라는 뷰 리졸버를 자동으로 등록한다.
이때 application.properties에 등록한 설정 정보를 사용하여 등록하게 된다.
또는 OldController의 리턴 값을 new ModelAndView(”/WEB-INF/views/new-form.jsp”)으로 전체 경로를 주어도 동작하기는 하나 권장하지 않는 방법이다.
뷰 리졸버의 동작 방식
스프링 부트가 자동으로 등록하는 뷰 리졸버의 종류는 다양하다.
// 빈 이름으로 뷰를 찾아서 반환한다. (예: 엑셀 파일 생성기능에 사용)
1 = BeanNameViewResolver
// JSP를 처리할 수 있는 뷰를 반환한다.
2 = InternalResourceViewResolver
...
이 외에도 다양한 뷰 리졸버가 있다.
동작 순서
- 핸들러 어댑터를 통해 논리 뷰 이름을 획득한다.
- new-form 획득
- ViewResolver를 순차적으로 호출한다.
- InternalResourceViewResolver 호출
- 뷰 리졸버는 뷰 정보를 반환한다.
- 뷰 리졸버는 InternalResourceView를 반환
- 반환된 뷰 정보는 forward()를 호출해서 처리할 수 있는 경우에 사용한다.
- InternalResourceView는 forward()를 호출
- view.render()가 호출되고 해당 뷰가 실행된다
- view.render() 호출되고 InternalResourceView는 forward()를 사용해서 JSP를 실행
'프레임워크(Framework) > Spring' 카테고리의 다른 글
[Spring MVC] HTTP 요청 헤더 정보 조회 (0) | 2022.11.14 |
---|---|
[Spring] 롬복(Lombok) @Data 어노테이션 (0) | 2022.11.14 |
[Spring MVC] 스프링 MVC 핸들러 매핑과 핸들러 어댑터 (0) | 2022.11.12 |
[Spring MVC] HTTP 요청 매핑(HTTP Request Mapping) 관련 어노테이션 정리 (0) | 2022.11.11 |
[Spring MVC] 스프링 MVC란 무엇인가? - 스프링 MVC 구조 이해 (0) | 2022.11.10 |