스프링 MVC - 1편 - 스프링 MVC 구조 이해 - 뷰 리졸버
인프런 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술편을 학습하고 정리한 내용 입니다.
이번에는 뷰 리졸버 에 대해 알아보자.

자 이전에 만들었던 OldController 에 ModelAndView를 리턴 하도록 해보자.
hello.servlet.web.springmvc.old.OldController
1
2
3
4
5
6
7
8
@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");
}
}
자 이렇게 뷰 이름 제공했다.

실행해보면 404에러가 나오고

콘솔에는 로그가 남겨져 있다.
이제 필요한 것이 viewResolver다. 등록하는 방법은 여러가지 있는데
application.properties에 등록하겠다.
스프링부트는 InternalResourceViewResolver라는 뷰 리졸버를 자동으로 등록하는데, 이 때
application.properties 에 등록한
spring.mvc.view.prefix
spring.mvc.view.suffix
설정 정보를 사용해서 등록한다
resources/application.properties
1
2
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
참고로 main 클래스에 아래 사진과 같이 Bean으로 직접 등록하는 것도 가능하다

또 그냥 return new ModelAndView("/WEB-INF/views/new-form.jsp"); 이렇게 해도 되는데 권장하진 않는다.
등록 한 후에 다시 시도해 보면

다음과 같이 잘 나온다.
뷰 리졸버 흐름
스프링 부트가 자동 등록하는 뷰 리졸버
1
2
1 = BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환한다. (예: 엑셀 파일 생성 기능 에 사용)
2 = InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환한다.
1. 핸들러 어댑터 호출
핸들러 어댑터를 통해 new-form이라는 논리 뷰 이름을 획득한다.
2. ViewResolver 호출
new-form이라는 뷰 이름으로 viewResolver를 순서대로 호출한다.BeanNameViewResolver는new-form이라는 이름의 스프링 빈으로 등록된 뷰를 찾아야 하는데 없다.InternalResourceViewResolver가 호출된다.
3. InternalResourceViewResolver
이 뷰 리졸버는 InternalResourceView를 반환한다.
4. 뷰 - InternalResourceView
InternalResourceView는 JSP처럼 포워드 forward()를 호출해서 처리할 수 있는 경우에 사용한다.
5. view.render()
view.render()가 호출되고 InternalResourceView는 forward()를 사용해서 JSP를 실행한다
참고
InternalResourceViewResolver는 만약 JSTL 라이브러리를 사용한다면InternalResourceView을 상속 받은JstlView를 반환함.JstlView는 JSTL 태그 사용 시 약간의 부가 기능 추가.
참고 다른 뷰는 실제 뷰를 랜더링 하지만, JSP의 경우
forward()통해서 해당 JSP로 이동(실행)해야 랜더링 된다.
JSP를 제외한 나머지 뷰 템플릿 들은forward()과정 없이 바로 랜더링 된다.
참고 Thymeleaf 뷰 템플릿을 사용하면
ThymeleafViewResolver를 등록해야 한다.
최근에는 라이브러리만 추 가하면 스프링 부트가 이런 작업도 모두 자동화해준다.
댓글남기기