[스프링MVC 28] 스프링 MVC 구조: 핸들러 매핑과 핸들러 어댑터 (tistory.com)
View를 조회할 수 있도록 변경했다.
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@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");
}
}
실행해보면 컨트롤러는 정상 호출되지만, Whitelabel Error Page 오류가 발생한다.
- application.properties 에 다음 코드를 추가
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
- 스프링 부트는 InternalResourceViewResolver 라는 뷰 리졸버를 자동으로 등록하는데, 이때 application.properties 에 등록한 spring.mvc.view.prefix , spring.mvc.view.suffix 설정 정보를 사용해서 등록한다.
이제 등록 폼(new-form)이 정상 출력된다! (뷰 리졸버가 잘 동작되었다)
[스프링MVC 27] 스프링 MVC 구조 (tistory.com)
- 스프링 부트가 자동 등록하는 뷰 리졸버 (일부 생략)(실제로는 더 많음)
- BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환 (예: 엑셀 파일 생성 기능에 사용)
- InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환
- 핸들러 어댑터 호출
- 핸들러 어댑터를 통해 new-form이라는 논리 뷰 이름을 획득한다.
- ViewResolver 호출
- new-form이라는 뷰 이름으로 viewResolver를 순서대로 호출한다. BeanNameViewResolver 는 new-form이라는 이름의 스프링 빈으로 등록된 뷰를 찾아야 하는데 없다. InternalResourceViewResolver 가 호출된다.
- InternalResourceViewResolver
- 이 뷰 리졸버는 InternalResourceView 를 반환한다.
- 뷰 - InternalResourceView
- InternalResourceView는 JSP처럼 포워드forward() 를 호출해서 처리할 수 있는 경우에 사용한다.
- view.render()
- view.render() 가 호출되고 InternalResourceView 는 forward()를 사용해서 JSP를 실행한다.
[스프링MVC 23] MVC 프레임워크 만들기: View 분리 (tistory.com)
- InternalResourceViewResolver는 만약 JSTL 라이브러리가 있으면 InternalResourceView를 상속받은 JstlView 를 반환한다. JstlView는 JSTL 태그 사용시 약간의 부가 기능이 추가된다.
- 다른 뷰는 실제 뷰를 렌더링하지만, JSP의 경우 forward() 통해서 해당 JSP로 이동(실행)해야 렌더링이 된다. JSP를 제외한 나머지 뷰 템플릿들은 forward() 과정 없이 바로 렌더링 된다.
728x90
반응형
'Spring Tutorial' 카테고리의 다른 글
[스프링MVC 31] 스프링 MVC: 컨트롤러 통합 (0) | 2023.08.08 |
---|---|
[스프링MVC 30] 스프링 MVC: 시작 (0) | 2023.08.07 |
[스프링MVC 28] 스프링 MVC 구조: 핸들러 매핑과 핸들러 어댑터 (0) | 2023.08.05 |
[스프링MVC 27] 스프링 MVC 구조 (0) | 2023.08.03 |
[스프링MVC 26] MVC 프레임워크 만들기: 유연한 컨트롤러 (0) | 2023.08.02 |