반응형
뷰 리졸버의 동작 방식을 살펴 보자.
먼저 아래와 같이 Controller 인터페이스를 사용한 어댑터로 테스트를 해보자.
return new ModelAndView(”new-Form”); 과 같이 사용할 수 있다.
@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");
}
}
application.properties
에 추가 한다.
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
InternalResourceViewResolver
스프링 부트가 뷰 리졸버를 자동으로 등록 해준다.
이 때, application.properties
의 설정을 읽어오게 되는 것이다.
대략 아래와 같이 @Bean을 등록하는 것을 자동으로 해주는 것이다.
@ServletComponentScan // 서블릿 자동 등록
@SpringBootApplication
public class ServletApplication {
public static void main(String[] args) {
SpringApplication.run(ServletApplication.class, args);
}
@Bean
ViewResolver internalResourceViewResolver() {
return new InternalResourceViewResolver("/WEB-INF/views/", ".jsp");
}
뷰 리졸버 동작 방식
스프링 부트가 자동으로 등록하는 뷰 리졸버
2개만 살펴보자. 앞의 숫자는 우선 순위
1 = BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환한다.
2 = InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환한다.
- 핸들러 어댑터 호출
- 핸들러 어댑터를 통해
new-form
이라는 논리 뷰 이름을 획득한다.
- 핸들러 어댑터를 통해
- ViewResolver 호출
new-form
이라는 뷰 이름으로 viewResolver를 순서대로 호출한다.BeanNameViewResolver
는new-form
이라는 이름의 스프링 빈으로 등록된 뷰를 찾아야 하는데 없다.- 결국
InternalResourceViewResolver
가 호출된다.
- InternalResourceViewResolver
- 뷰 리졸버는
InternalResourceView
를 반환한다. 그림에서view
이다.
- 뷰 리졸버는
- InternalResourceView
JSP처럼 foward()
를 호출해서 처리할 수 있는 경우에 사용한다.
- view.render()
- 렌더링을 하기 위해
setAttribute
와 같은 등의 작업을 한다. - 이 후
forward()
를 하여 JSP를 실행한다.
- 렌더링을 하기 위해
참고
InternalResourceViewResolver
는 만약 JSTL 라이브러리가 있다면InternalResourceView
를
상속받은JstlView
를 반환한다.- 다른 뷰는 실제 뷰를 렌더링하지만, JSP는 forward()를 통해서 JSP로 이동(실행)해야 렌더링이 된다.
JSP를 제외한 나머지 뷰 템플릿들은forward()
과정 없이 바로 렌더링 된다. - Thymeleaf 뷰 템플릿을 사용하면
ThymeleafViewResolver
를 등록해야 한다.
최근에는 라이브러리만 추가하면 스프링 부트가 이런 작업도 모두 자동화 해준다.
반응형
'Spring' 카테고리의 다른 글
스프링에서 싱글톤 빈을 사용해도 위험하지 않은가? (0) | 2022.02.14 |
---|---|
스프링 HTTP 메시지 컨버터 (0) | 2022.02.14 |
스프링의 핸들러 매핑과 어댑터 (0) | 2022.01.24 |
스프링 MVC 구조 알아보기 (0) | 2022.01.24 |
프론트 컨트롤러 패턴 (0) | 2022.01.24 |