본문 바로가기
Dev/Spring

스프링 ViewResolver

by vellahw 2022. 10. 19.

 

 

스프링 컨트롤러는 뷰에 의존적이지 않다. 컨트롤러는 아래 코드와 같이 결과를 생성할 뷰의 이름만 지정할 뿐이다.

1
2
3
4
5
6
7
8
@Controller
    public class HelloController {
        @RequestMapping("/hello.do")
         public String hello(){
             //처리 결과를 뷰 이름 지정
             return "hello";
       }
cs

 

  • 컨트롤러가 지정한 뷰 이름으로부터 응답 결과 화면을 생성하는 View 객체는 ViewResolver가 구한다.

 

 

💡. ViewResolver 인터페이스

1
2
3
4
5
6
7
package org.springframework.web.servlet;
            
import java.util.Locale;
            
public interface ViewResolver{
  View resolveViewName(String viewName, Locale locale) throws Exception;
}
cs

ViewResolver Interface는 위와 같이 정의되어 있다.

ViewResolver는 뷰 이름과 지역화를 위한 Locale을 파라미터로 전달받으며, Mapping되는 View 객체를 리턴한다. 

만약, Mapping되는 View 객체가 존재하지 않으면 null을 리턴한다.

 

💡. View 객체

모든 뷰 클래스는는 View Interface를 구현하고 있으며, View Interface는다음과 같이 정의되어 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package org.springframework.web.servlet;
            
import java.util.Map;
            
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
            
public interface View {
    String RESPONSE_STATUS_ATTRIBUTE = View.clss.getName() + ".responseStatus";
                
    String getContentType();
 
    void render(Map<String,?> model, HttpServletRequest request) throws Exception;
}
cs

getContentType() 메서드는 "text/html"과 같은 응답 결과의 컨텐츠 타입을 리턴한다.

render() 메서드는 실제로 응답 결과를 생성한다. render() 메서드의 첫 번째 파라미터인 model에는 컨트롤러가 리턴한 ModelAndView 객체의 모델 데이터가 전달된다.

각각의 View 객체는 이 모델 데이터로부터 응답 결과를 생성하는데 필요한 정보를 구한다.

 

 

🎇. ViewResolver 구현 클래스

스프링은 몇 가지 ViewResolver 구현 클래스를 제공하고 있는데, 이중 InternalResourceViewResolver 클래스와 VelocityViewResolver 클래스, BeanNameViewResolver 클래스가 대표적이다.

ViewResolver 구현 클래스 설명
InternalResourceViewResolver 뷰 이름으로부터 JSP나 Tiles 연동을 위한 View 객체를 리턴
VelocityViewResolver 뷰 이름으로부터 Velocity 연동을 위한 View 객체를 리턴
BeanNameViewResolver 뷰 이름과 동일한 이름을 갖는 빈 객체를 View 객체로 사용

 

💡. InternalResourceViewResolver 설정

InternalResourceViewResolver 클래스는 JSP나 HTML 파일과 같이 웹 어플리케이션의 내부 리소스을 이용하여 뷰를 생성하는 AbstractUrlBasedView 타입의 뷰 객체를 리턴한다. 기본적으로 사용하는 View Class는 InternalResourceView Class이다.
        
InternalResourceViewResolver Class는 다음과 같이 설정한다.

1
2
3
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
        p:prefix="/WEB-INF/viewjsp/" p:suffix=".jsp">
</bean>
cs

 

InternalResourceViewResolver는 컨트롤러가 지정한 뷰 이름으로부터 실제로 사용될 뷰를 선택하는데, 이 때 컨트롤러가 지정한 뷰 이름 앞뒤로 prefix 프로퍼티와 suffix 프로퍼티를 추가한 값이 실제로 사용될 리소스의 경로가 된다.

예를 들어, 컨트롤러에서 다음과 같이 뷰 이름을 지정했다고 하면

         ModelAndView mav = new ModelAndView("hello");
         return mav;

이 경우 InternalResourceViewResolver가 사용하는 리소스의 경로는 다음과 같이 결정된다.

 

 

💡. BeanNameViewResolver 설정

BeanNameViewResolver 클래스는 뷰 이름과 동일한 이름을 갖는 빈을 뷰 객체로 사용한다.

BeanNameViewResolver는 주로 커스텀 View 클래스를 뷰로 사용해야 하는 경우에 사용된다. 예를 들어, 파일 Download를 위한 정보를 읽어와 뷰에 전달하는 컨트롤러는 Download 관련 정보를 뷰에 전달할 것이다.

1
2
3
4
5
6
7
8
9
@Controller
public class DownloadController{
    @RequestMapping("/download.do")
    public ModelAndView download(HttpServletRequest request, HttpServletResponse response){
        File downloadFile = getFile(request);
            return new ModelAndView("download""downloadFile", downloadFile);
       }
          ...
}
cs

위 결과를 보여 줄 View 클래스가 DownloadView 클래스라고 가정하면 이 경우 DownloadView 클래스를 "download" 이름으로 bean에 등록하고 ViewResolver로 BeanNameViewResolver Class를 사용하면 된다.

1
2
<bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
<bean id="download" class="madvirus.spring.chap07.view.DownloadView"/>
cs

위 코드와 같이 설정하면 DownloadController 클래스의 처리 결과를 DownloadView가 생성하게 된다.

 

 

댓글