위와 같이 ModelAndView에 논리주소를 담아 반환하여 해당 url로 접속해보면
위와 같은 404페이지가 뜨는데 이는 현재 ViewResolver가 없기 때문에 매칭되는 뷰를 찾지못했다는 오류이다.
뷰 리졸버 : InternalResourceViewResolver
스프링부트는 InternalResourceViewResolver라는 뷰 리졸버를 자동으로 등록하는데,
이때 application.properties에 등록한 spring.mvc.view.prefix (접두사), spring.mvc.view.suffix(접미사)를
사용하여 등록한다.
- 위와 같이 application.properties에 등록해두면 우리가 ModelAndView에 넣은 논리주소인 new-form과 더해져서
- /WEB-INF/views/new-form.jsp의 뷰를 찾아들어가게 되는 것이다.
- 참고로 retrun ModelAndView("/WEB-INF/views/new-form.jsp")와 같이 작성해도 동작은 하지만 권장X
스프링 부트가 자동 등록하는 ViewResolver
- BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환
- 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를 반환 ==> JSTL 태그 사용시 약간의 부가 기능 추가
다른 뷰는 실제 뷰를 렌더링하지만, JSP의 경우 forward()를 통해서 해당 JSP로 이동해야 렌더링 된다. 나머지 뷰 템플릿들은 forward 과정 없이 바로 렌더링
Thymeleaf 뷰 템플릿을 사용하면 ThymeleafViewResolver를 등록, 최근에는 라이브러리만 추가하면
스프링 부트가 이런 작업도 모두 자동화해줌
반응형
'Spring > Spring MVC' 카테고리의 다른 글
로깅 간단히 알아보기 (0) | 2021.05.03 |
---|---|
Spring MVC (0) | 2021.05.01 |
Handler Mapping & Handler Adapter (0) | 2021.04.30 |
Spring MVC 전체 구조 (0) | 2021.04.30 |
유연한 컨트롤러 (0) | 2021.04.28 |