프레임워크(Framework)/Spring

[Spring MVC] 스프링 MVC 뷰 리졸버(View Resolver)

잇트루 2022. 11. 13. 00:00
반응형
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다.
'스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술'
 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com

 

뷰 리졸버(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

...

이 외에도 다양한 뷰 리졸버가 있다.

 

동작 순서

  1. 핸들러 어댑터를 통해 논리 뷰 이름을 획득한다.
    • new-form 획득
  2. ViewResolver를 순차적으로 호출한다.
    • InternalResourceViewResolver 호출
  3. 뷰 리졸버는 뷰 정보를 반환한다.
    • 뷰 리졸버는 InternalResourceView를 반환
  4. 반환된 뷰 정보는 forward()를 호출해서 처리할 수 있는 경우에 사용한다.
    • InternalResourceView는 forward()를 호출
  5. view.render()가 호출되고 해당 뷰가 실행된다
    • view.render() 호출되고 InternalResourceView는 forward()를 사용해서 JSP를 실행

 

반응형