[Spring] Spring MVC (3)

이연우·2025년 7월 22일

TIL

목록 보기
24/100

🔍 ViewResolver란?

  • DispatcherServlet이 컨트롤러에서 반환한 논리 View 이름을 받아,
    실제 렌더링할 View 객체로 변환하는 역할을 함

💡 기본 흐름
1. Controller가 ModelAndView("test") 반환
2. DispatcherServlet이 viewResolver 호출
3. 논리 View 이름 "test" → 물리 경로 /WEB-INF/views/test.jsp 변환
4. 해당 JSP 파일을 Rendering

🗒️ 예시 코드

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

→ 📍 호출: http://localhost:8080/view-controller

🛠️ View 템플릿 예시 (test.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>

→ 📂 위치: /WEB-INF/views/test.jsp

⚙️ ViewResolver 설정 (Spring Boot)

  • Spring Boot는 기본적으로 InternalResourceViewResolver를 자동 등록함
spirng.mvc.view.prefix=/WEB-INF/views/
spirng.mvc.view.suffix=.jsp

→ 논리 View 이름 "test"/WEB-INF/views/test.jsp

⚠️ View를 찾지 못하면?

@Component("/error-controller")
public class WhitelabelErrorController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) {
        return new ModelAndView("sparta"); // View 파일 없음
    }
}

→ JSP가 존재하지 않으면 Spring Boot 기본 에러 페이지(Whitelabel Error Page) 출력


🧰 Spring Boot의 주요 ViewResolver

  • Spring Boot를 사용하면 개발에 필요하여
    자동으로 등록되는 ViewResolver들이 있음
  • 우선순위 순서
  1. BeanNameViewResolver
    • Bean Name으로 View를 찾아 반환
  2. InternalResourceViewResolver
    • application.properties 설정 파일에 등록한 prefix, suffix 설정 정보를 사용하여 ViewResolver 등록
      // 아래 코드를 자동으로 해 주는것과 마찬가지
      @Bean
      InternalResourceViewResolver internalResourceViewResolver() {
      	return new InternalResourceViewResolver("/WEB-INF/views", ".jsp");
      }

🚦 ViewResolver 동작 순서

  • application.properties 설정 파일에 등록한 prefix, suffix 설정 정보를 사용하는 ViewResolver

  1. HandlerAdapter: "test"라는 논리 View 이름 반환

  2. ViewResolver:

    • BeanNameViewResolver → 실패
    • InternalResourceViewResolver → 성공
  3. InternalResourceViewResolver:

    • "test"/WEB-INF/views/test.jsp 로 변환
    • InternalResourceView 반환
  4. view.render():

    • RequestDispatcher.forward() 실행 → JSP 렌더링

🪄 Thymeleaf 사용 시

  • Thymeleaf는 View + Resolver가 모두 내장되어 있기 때문에
    return "home"만으로 자동 렌더링 가능 (라이브러리 의존성만 추가)

0개의 댓글