T_era

Spring MVC View Resolver 본문

Programing/Spring

Spring MVC View Resolver

블스뜸 2025. 5. 5. 16:42

ViewResolver의 핵심 역할
Controller가 알려준 이름(논리적인 이름)을 가지고 실제 화면을 그려줄 수 있는 도구(View 객체)를 찾아주는 역할

View Resolver는 Controller에서 반환된 ModelAndView 객체의 논리적인 View 이름(ViewName)을 기반으로 실제 View 객체를 생성하고, 해당 View로 응답 생성을 위임하는 역할을 수행한다. DispatcherServlet은 ViewResolver를 호출하여 View 정보를 설정한다.

Java
 
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");
    }
}

위 ViewController는 논리적인 View 이름으로 "test"를 담은 ModelAndView 객체를 반환한다.

Template Engine: JSP

Java
 
<%@ 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>

JSP는 Spring MVC에서 View를 생성하는 데 사용될 수 있는 템플릿 엔진 중 하나이다.

ViewResolver 설정 (application.properties)

Spring Boot는 application.properties 파일의 설정을 기반으로 InternalResourceViewResolver를 자동으로 생성한다.

Properties
 
spirng.mvc.view.prefix=/WEB-INF/views/
spirng.mvc.view.suffix=.jsp

위 설정은 논리적인 View 이름에 prefix /WEB-INF/views/와 suffix .jsp를 결합하여 물리적인 View 파일 경로를 결정하도록 InternalResourceViewResolver에 지시한다. 따라서 Controller에서 "test"라는 ViewName이 반환되면, InternalResourceViewResolver는 /WEB-INF/views/test.jsp 파일을 View로 사용하게 된다.

View를 찾지 못하는 경우

Java
 
@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");
    }
}

위 ErrorController는 존재하지 않는 논리적인 View 이름 "sparta"를 반환한다. 이 경우 ViewResolver는 해당 View를 찾을 수 없게 되고, Spring Boot는 기본적으로 Whitelabel Error Page를 클라이언트에게 응답한다.

Spring Boot의 ViewResolver 우선순위

Spring Boot는 다양한 ViewResolver 구현체를 제공하며, 우선순위에 따라 View를 찾는다. 주요 ViewResolver는 다음과 같다.

  1. BeanNameViewResolver: Spring Bean의 이름으로 View를 찾아 반환한다.
  2. InternalResourceViewResolver: application.properties 파일에 등록된 prefix, suffix 설정 정보를 사용하여 View를 찾는다. (위 예시 코드에서 사용)

이 외에도 다양한 템플릿 엔진 (Thymeleaf, FreeMarker 등)을 위한 ViewResolver 구현체가 존재하며, Spring Boot는 필요한 의존성 추가 시 해당 ViewResolver를 자동으로 구성한다.