백엔드 웹 개발 노트5.3 - 뷰 리졸버
뷰 리졸버
전에 작성한 OldController를 View를 조회할 수 있게 수정할 것이다.
1
2
System.out.println("OldController.handlerRequest");
return new ModelAndView("new-form");
리턴값만 수정해주었다. 다시 실행해보면 ‘Whitelabel Error Page’가 뜨면서 콘솔에는 문자열이 찍힐 것이다.
application.properties에서 다음과 같이 코드를 추가해주면?
1
2
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
다시 실행해보면
내가 예전에 작성한 페이지가 뜬다.
왜 그런걸까?
스프링 부트는 InternalResourceViewResolver라는 뷰 리졸버를 자동으로 등록하는데, 이때 application.properties에 등록한 spring.mvc.view.prefix, spring.mvc.view.suffix 설정정보를 사용해서 등록한다.
권장하지 않지만 사실상 이렇게 경로를 주어도 동작은한다.
1
return new ModelAndView("/WEB-INF/views/new-form.jsp");
뷰 리졸버도 우선순위에 따라 스프링 부트가 찾는다.
1
2
3
(생략된 부분이 많다.)
1 = BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환한다.
2 = InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환한다.
위 코드같은 경우 빈 이름을 지정해주지 않았으므로 2번인 InternalResourceViewResolver에서 찾게 된다.
흐름을 알아보자.
- 핸들러 어댑터를 통해 new-form이라는 논리 뷰 이름을 획득.
- new-form이라는 뷰 이름으로 viewResolver를 순서대로 호출하는데, 빈 이름으로 등록되지 않았으므로 타고타고 내려가다가 InternalResourceViewResolver가 호출
- InternalResourceViewResolver는 InternalResourceView를 반환한다.
- InternalResourceView는 JSP처럼 forward()를 호출해서 처리할 수 있는 경우에 사용한다.
- view.render()가 호출되고, InternalResourceView는 forward()를 사용해서 JSP를 실행한다.
참고로 JSP를 제외한 나머지 뷰 템플릿들은 forward() 과정 없이 바로 렌더링된다.
This post is licensed under CC BY 4.0 by the author.