오봉이와 함께하는 개발 블로그

스프링 MVC 1 - 뷰 리졸버 본문

BE/Spring

스프링 MVC 1 - 뷰 리졸버

오봉봉이 2022. 8. 12. 22:19
728x90

뷰 리졸버

OldController - View 조회할 수 있도록 변경

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

http://localhost:8080/springmvc/old-controller로 실행하면 브라우저에 오류가 발생하고 콘솔에는 정상 출력된다.
application.properties에 다음 코드를 추가하자

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

이제 정상 작동하는 것을 확일할 수 있다.

뷰 리졸버 - InternalResourceViewResolver

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

권장하는 방법은 아니지만 return new ModelAndView("/WEB-INF/views/new-form.jsp");로 작성해서 동작하기는 한다.

뷰 리졸버 동작 방식

스프링 부트가 자주 등록하는 뷰 리졸버

  • 1 순위 : BeanNameViewResolver - 빈 이름으로 뷰를 찾아서 반환한다.
  • 2 순위 : InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환한다.

1. 핸들러 어댑터 호출

핸들러는 어댑터를 통해 new-form이라는 논리 뷰 이름을 획득한다.

2. ViewResolver 호출

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

3. InternalResourceVieResolver

이 뷰 리졸버는 InternalResourceView를 반환한다.

4. 뷰 - InternalResourceView

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

5. view.render()

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

참고

  1. InternalResourceViewResolver는 만약 JSTL 라이브러리가 있으면 InternalResourceView를 상속받은 JstlView를 반환한다.
  2. 다른 뷰는 실제 뷰를 렌더링하지만, JSP의 경우 forward() 통해서 해당 JSP로 이동(실행)해야 렌더링이 된다. JSP를 제외한 나머지 뷰 템플릿들은 forward() 과정 없이 바로 렌더링 된다.
  3. Thymeleaf 뷰 템플릿을 사용하면 ThymeleafViewResolver를 등록해야 한다. 최근에는 라이브러리만
    추가하면 스프링 부트가 이런 작업도 모두 자동화해준다.
출처 : 인프런 김영한 지식 공유자님 강의 - 스프링 MVC 1편 백엔드 웹 개발 핵심 기술
728x90
Comments