Spring/mvc

[Spring MVC 1] - 뷰 리졸버

dev_rosieposie 2022. 11. 2. 00:33

Goal  : 뷰 리졸버가 어떻게 사용되는지 알아본다.

 

OldController

hello/servlet/web/springmvc/old/OldController.java

@Component("/springmvc/old-controller")
public class OldController implements Controller {

    // @Component("/springmvc/old-controller")를 해주면 스프링빈의 이름이 /springmvc/old-controller가 된다
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("OldController.handleRequest");
        return null;
    }
}

 

http://localhost:8080/springmvc/old-controller 실행 결과

  • 정상호출 되나, whitelavel error page 오류가 발생한다.

application.properties에 다음 코드 추가

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

 

뷰 리졸버 - InternalResourceViewResolver

스프링 부트는 InternalResourceViewResolver라는 뷰 리졸버를 자동으로 등록하는데, 이때 application.properties에 등록한 spring.mvc.view.prefix, spring.mvc.view.suffix 설정 정보를 사용해서 등록한다.

 

http://localhost:8080/springmvc/old-controller 실행 결과

  • 정상호출 

스프링 MVC 전체 구조

스프링 부트가 자동 등록하는 뷰 리졸버

  •  1  = BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환한다. (ex: 엑셀 파일 생성 기능에 사용)
  •  2  = InternalResourcweViewResolver : 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를 등록해야 한다. 최근에는 라이브러리만 추가하면 스프링부트가 이런 작업도 모두 자동화 해준다.

 

 

 


나는 나답게!!!!

 

 

 

@ 스프링 MVC 1편 - 백엔드 웹개발 by 김영한을 참조하고 있습니다.