본문 바로가기
Spring|Spring-boot

뷰 리졸버

by oncerun 2021. 12. 25.
반응형

 

핸들러는 return을 다양하게 할 수 있다. void를 가진 HttpRequestHandler구현체들이 있는 반면,

ModelAndView를 반환하는 핸들러, View객체를 반환하는 핸들러 등등 을 반환하지만

이는 모두 어댑터에 의하여 ModelAndView 객체를 FrontController인 DispatcherServlet에게 반환된다.

 

가장 많이 쓰이는 것은 return에 jsp이름을 반환하는 경우인데, 전체 경로가 아닌 논리적인 경로를 반환한다.

스프링 MVC는 ViewResolver 역시 인터페이스로 구현되여있어 다양한 ViewResolver를 사용할 수 있다.

 

@Component("/springmvc/old-controller")
public class OldController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        return new ModelAndView("old-form");
    }
}

 

SimpleControllerHandlerAdapter가 실행하는 OldController의 handleRequest()는 ModelAndView를 반환하며 논리적 view 이름은 old-form이다.  

 

그럼 이 논리적 View 이름을 실제 서버 리소스상에 있는 View파일을 찾아서 제공해줘야 하기 때문에 물리 뷰 이름을 찾는 과정을 진행하는데 이때 사용되는 것이 ViewResolver이다.

 

ViewResovler를 사용해 View를 제공한다는 의미는 React, Anguler, Vue 등 CSR를 사용하여 클라이언트에서 화면을 렌더링 하는 개념이 아닌 SSR인 서버 사이드 렌더링 기술에 포함된다. 즉 서버에서 모든 화면을 그리고 view 페이지를 Http 응답으로 전달한다는 것이다.

 

다양한 SSR 기술이 있지만 대중적으로 많이 사용되는 건 타임리프, JSP, velocity 등등이 존재한다.

 

아마 JSP를 사용하는 레거시가 많고 타임리프가 Spring 지원을 받기 때문에 간단한 HTML이 필요한 경우 타임리프를 많이 사용한다. 

 

  • InternalResourceViewResolver - JSP를 사용하여 뷰를 생성한다.
  • VelocityViewResolver - Velocity 템플릿 엔진을 사용하여 뷰를 생성한다.

 

    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/view/" />
        <property name="suffix" value=".jsp" />
    </bean>

springMVC를 사용하고 JSP로 뷰를 렌더링 할 때에는 InternalResourceViewResolver를 사용한다.

이때 prefix, suffix가 논리적인 뷰 이름에 물리적인 뷰 이름으로 변환될 때 자동적으로 붙여지는 접두사, 접미사이다.

 

위에서 view이름이 old-form이 논리적 뷰 이름이었다면 물리 뷰 이름은 WEB-INF/view/old-form.jsp 일 것이다.

 

스프링 부트에서는 아주 간단하다.

resource 디렉토리에 존재하는 application.properties 혹은 application.yml에 문법에 맞게 다음과 같이 설정하면 된다.

 

 * prefix = /WEB-INF/views/ 로 수정

 

이 InternalResourceViewResolver는 InternalResourceview를 반환한다.  내부에서 자원을 찾을 수 있는 경우에 사용한다.

forward()를 호출할 수 있는 경우에 사용하면 됩니다.

 

만약 InternalResourceViewResolver는 만약 JSTL 라이브러리가 있으면 InternalResourceView를 상속받은 JstlView를 반환한다.

 

 

 

 

반응형

댓글