1 분 소요


OldController - View 조회 가능으로 변경

@Component("/springmvc/old-controller")
public class OldController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        return new ModelAndView("new-form");
    }
}

View를 사용할 수 있도록 return new ModelAndView("new-form");을 추가했다.

실행 후 오류가 발생하지 않으려면 다음 코드를 추가해야 한다.
application.properties

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

뷰 리졸버 - InternalResourceViewResolver
스프링 부트는 InternalResourceViewResolver라는 뷰 리졸버를 자동으로 등록하는데, 이때 application.properties에 등록한 spring.mvc.view.prefix, spring.mvc.view.suffix설정 정보를 사용해서 등록한다.


ViewResolver 동작 방식

스프링 MVC 구조
springMVC

스프링 부트가 자동 등록하는 ViewResolver
(일부 생략…)

1 = BeanNameViewResolver : 빈 이름으로 View를 찾아서 반환.
2 = InternalResourceViewResolver : JSP를 처리할 수 있는 View를 반환.

1. 핸들러 어댑터 호출
핸들러 어댑터를 통해 new-form이라는 View 논리 이름을 획득.

2. ViewResolver 호출

  • new-form이라는 View 이름으로 viewResolver를 순서대로 호출.
  • BeanNameViewResolvernew-form이라는 이름의 스프링 빈으로 등록된 View를 찾아야 하지만 없다.
  • InternalResourceViewResolver가 호출.

3. InternalResourceViewResolver
InternalResourceView반환.

4. View - InternalResourceView
InternalResourceView는 JSP처럼 forward()를 호출해서 처리할 수 있는 경우에 사용한다.

5. view.render()
view.render()가 호출되고 InternalResourceViewforward()를 사용해서 JSP를 실행한다.

InternalResourceViewResolver는 만약 JSTL 라이브러리가 있으면 InternalResourceView를 상속받는 JstlView를 반환한다.

다른 View는 실제 View를 렌더링하지만, JSP의 경우 forward()를 통해서 해당 JSP로 이동(실행)해야 렌더링이 된다. JSP를 제외한 나머지 뷰 템플릿들은 forward()과정 없이 바로 렌더링 된다.

Thymeleaf 뷰 템플릿을 사용하면 ThymeleafViewResolver를 등록해야 하지만, 최근에는 라이브러리만 추가하면 스프링 부트가 모두 자동화해준다.


<출처 : 인프런 - 스프링 MVC 1편 : 백엔드 웹 개발 핵심 기술(김영한)>

댓글남기기