Spring MVC 3

사나이장대산·2024년 11월 1일

Spring

목록 보기
3/26

View Resolver

  • 반환된 ModelAndView 객체를 알맞은 View로 전달하기 위해 DispatcherServlet에서 ViewResolver를 호출하여 View 정보를 설정하는 역할을 수행한다.

- 구현예시

package com.example.springbasicmvc.controller;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

// Spring Bean 이름을 URL로 설정
@Component("/view-controller")
public class ViewController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {

        System.out.println("view-controller가 호출 되었습니다.");

        // "test"는 논리적인 ViewName이다. ViewResolver가 물리적인 이름으로 변환해야 한다.
        return new ModelAndView("test");
    }
}

- Template Engine JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <meta charset="UTF-8">
  <title>블로그 포스트 작성 페이지</title>
</head>
<body>
<h1>블로그 글쓰기</h1>
<form action="save" method="post">
  title: <input type="text" name="title" placeholder="제목" />
  content: <input type="text" name="content" placeholder="내용" />
  <button type="submit">저장</button>
</form>

</body>
</html>
  • ViewResolver
    • application.properties 설정
    • 설정을 기반으로 Spring Boot가 InternalResourceViewResolver 를 만든다

localhost:8080/view-controller 호출 한 모습


  • ViewName으로 View를 찾지 못하는 경우(View가 존재하지 않음)
@Component("/error-controller")
public class WhitelabelErrorController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("error-controller가 호출 되었습니다.");
				// viewName "sparta"는 존재하지 않는다.
        return new ModelAndView("sparta");
    }
}

컨트롤러는 호출되지만 View를 못 찾아 Whitelabel Error Page를 응답한다.


Spring Boot의 ViewResolver

  • Spring Boot를 사용하면 개발에 필요하여 자동으로 등록되는 ViewResolver들이 있다

  • 우선순위 순서

    • 아래 두 가지 이외에도 많은 ViewResolver가 존재한다.
    1. BeanNameViewResolver
      • Bean Name으로 View를 찾아 반환
    2. InternalResourceViewResolver(위 예시코드)
      • application.properties 설정 파일에 등록한 prefix, suffix 설정 정보를 사용하여 ViewResolver 등록
// 아래 코드를 자동으로 해주는것과 마찬가지이다.
@Bean
InternalResourceViewResolver internalResourceViewResolver() {
	return new InternalResourceViewResolver("/WEB-INF/views", ".jsp");
}

InternalResourceViewResolver로 알아보는 Spring MVC 동작 순서

  • application.properties 설정 파일에 등록한 prefix, suffix 설정 정보를 사용하는 ViewResolver
  1. HandlerAdapter 호출
    • HandlerAdapter를 통해 “test” 논리 View Name 얻음
  2. ViewResolver 호출
    • ”test” 이라는 View Name으로 viewResolver를 우선순위 대로 호출
      • BeanNameViewResolver는 View를 찾지 못한다.
      • InternalResourceViewResolver 호출
  3. InternalResourceViewResolver
    - InternalResourceViewResolver.buildView(String viewName)
    → InternalResourceView 반환

    4.JSP와 같이 서버에서 이동하는 forward()를 호출하는 경우와 같을 때 사용한다.

    renderMergedOutputModel() → Model을 Request로 바꾼다.
  4. view.render()
    • 외부에서 view.render()를 호출 후 RequestDispatcher를 가져와 forward()한다.

Thymeleaf는 View와 Resolver가 이미 존재한다. 라이브러리 의존성만 추가해주면 SpringBoot가 모두 자동으로 해준다. 즉, return “viewName”; 만으로 View가 Rendering 된다.

profile
사나이 張大山 포기란 없다.

0개의 댓글