1 분 소요

인프런 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술편을 학습하고 정리한 내용 입니다.

이번에는 뷰 리졸버 에 대해 알아보자.

자 이전에 만들었던 OldController 에 ModelAndView를 리턴 하도록 해보자.

hello.servlet.web.springmvc.old.OldController

1
2
3
4
5
6
7
8
@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");  
    }  
}

자 이렇게 뷰 이름 제공했다.

실행해보면 404에러가 나오고

콘솔에는 로그가 남겨져 있다.

이제 필요한 것이 viewResolver다. 등록하는 방법은 여러가지 있는데

application.properties에 등록하겠다.

스프링부트는 InternalResourceViewResolver라는 뷰 리졸버를 자동으로 등록하는데, 이 때 application.properties 에 등록한

spring.mvc.view.prefix spring.mvc.view.suffix

설정 정보를 사용해서 등록한다

resources/application.properties

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

참고로 main 클래스에 아래 사진과 같이 Bean으로 직접 등록하는 것도 가능하다

또 그냥 return new ModelAndView("/WEB-INF/views/new-form.jsp"); 이렇게 해도 되는데 권장하진 않는다.

등록 한 후에 다시 시도해 보면

다음과 같이 잘 나온다.

뷰 리졸버 흐름

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

1
2
1 = BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환한다. (예: 엑셀 파일 생성 기능 에 사용)
2 = InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환한다.

1. 핸들러 어댑터 호출

핸들러 어댑터를 통해 new-form이라는 논리 뷰 이름을 획득한다.

2. ViewResolver 호출

  • new-form이라는 뷰 이름으로 viewResolver를 순서대로 호출한다.
  • BeanNameViewResolvernew-form이라는 이름의 스프링 빈으로 등록된 뷰를 찾아야 하는데 없다.
  • InternalResourceViewResolver가 호출된다.

3. InternalResourceViewResolver

이 뷰 리졸버는 InternalResourceView를 반환한다.

4. 뷰 - InternalResourceView

InternalResourceView는 JSP처럼 포워드 forward()를 호출해서 처리할 수 있는 경우에 사용한다.

5. view.render()

view.render()가 호출되고 InternalResourceViewforward()를 사용해서 JSP를 실행한다

참고 InternalResourceViewResolver는 만약 JSTL 라이브러리를 사용한다면 InternalResourceView을 상속 받은 JstlView를 반환함. JstlView는 JSTL 태그 사용 시 약간의 부가 기능 추가.

참고 다른 뷰는 실제 뷰를 랜더링 하지만, JSP의 경우 forward()통해서 해당 JSP로 이동(실행)해야 랜더링 된다.
JSP를 제외한 나머지 뷰 템플릿 들은 forward() 과정 없이 바로 랜더링 된다.

참고 Thymeleaf 뷰 템플릿을 사용하면 ThymeleafViewResolver 를 등록해야 한다.
최근에는 라이브러리만 추 가하면 스프링 부트가 이런 작업도 모두 자동화해준다.

태그:

카테고리:

업데이트:

댓글남기기