스프링 컨트롤러는 뷰에 의존적이지 않다. 컨트롤러는 아래 코드와 같이 결과를 생성할 뷰의 이름만 지정할 뿐이다.
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가 생성하게 된다.
'Dev > Spring' 카테고리의 다른 글
URI 템플릿 사용 - @PathVariable, @RequestMapping (0) | 2022.10.20 |
---|---|
DispatcherServlet - alwaysUseFullPath (0) | 2022.10.20 |
HandlerInterceptor : 요청 가로채기 (0) | 2022.10.19 |
@InitBinder 어노테이션 (1) | 2022.10.18 |
스프링 Multipart : 파일 업로드 처리 (1) | 2022.10.18 |
댓글