Spring

스프링의 뷰 리졸버

monkeyDugi 2022. 1. 24. 12:15
반응형

뷰 리졸버의 동작 방식을 살펴 보자.

먼저 아래와 같이 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를 처리할 수 있는 뷰를 반환한다.
  1. 핸들러 어댑터 호출
    1. 핸들러 어댑터를 통해 new-form이라는 논리 뷰 이름을 획득한다.
  2. ViewResolver 호출
    1. new-form이라는 뷰 이름으로 viewResolver를 순서대로 호출한다.
    2. BeanNameViewResolvernew-form이라는 이름의 스프링 빈으로 등록된 뷰를 찾아야 하는데 없다.
    3. 결국 InternalResourceViewResolver가 호출된다.
  3. InternalResourceViewResolver
    1. 뷰 리졸버는 InternalResourceView를 반환한다. 그림에서 view이다.
  4. InternalResourceView
    1. JSP처럼 foward()를 호출해서 처리할 수 있는 경우에 사용한다.
  5. view.render()
    1. 렌더링을 하기 위해 setAttribute와 같은 등의 작업을 한다.
    2. 이 후 forward()를 하여 JSP를 실행한다.

참고

  • InternalResourceViewResolver는 만약 JSTL 라이브러리가 있다면 InternalResourceView
    상속받은 JstlView를 반환한다.
  • 다른 뷰는 실제 뷰를 렌더링하지만, JSP는 forward()를 통해서 JSP로 이동(실행)해야 렌더링이 된다.
    JSP를 제외한 나머지 뷰 템플릿들은 forward() 과정 없이 바로 렌더링 된다.
  • Thymeleaf 뷰 템플릿을 사용하면 ThymeleafViewResolver를 등록해야 한다.
    최근에는 라이브러리만 추가하면 스프링 부트가 이런 작업도 모두 자동화 해준다.
반응형