컨트롤러 메서드의 리턴 타입은 ModelAndView를 비롯한 몇 가지 리턴 타입을 가질 수 있으며,
이들 리턴 타입은 다음과 같다.
리턴타입 | 설명 |
ModelAndView | 뷰 정보 및 모델 정보를 담고 있는 ModelAndView 객체 |
Model | 뷰에 전달할 객체 정보를 담고 있는 Model을 리턴한다. 이때 뷰 이름은 요청 URL로부터 결정 된다. (RequestToViewNameTranslator를 통해 뷰 결정) |
Map | 뷰에 전달할 객체 정보를 담고 있는 Map을 리턴한다. 이때 뷰 이름은 요청 URL로부터 결정 된다. (RequestToViewNameTranslator를 통해 뷰 결정) |
String | 뷰 이름을 리턴한다. |
View 객체 | View 객체를 직접 리턴. 해당 View 객체를 이용해서 뷰를 생성한다. |
void | 메서드가 ServletRequest나 ServletResponse 타입의 파라미터를 갖는 경우 메서드가 직접 응답을 처리한다고 가정한다. 그렇지 않을 경우 요청 URL로부터 결정된 뷰를 보여준다. (RequestToViewNameTranslator를 통해 뷰 결정) |
@RepositoryBody Annotation 적용 |
메서드에서 @Repository Annotation이 적용된 경우, 리턴 객체를 HTTP 응답으로 전송한다. HttpMessageConverter를 이용해서 객체를 HTTP 응답 스크림으로 변환한다. |
뷰 지정
컨트롤러 처리 메서드는 처리 결과를 보여줄 뷰 이름이나 View 객체를 리턴하고,
DispatcherServlet은 뷰이름이나 View객체를 이용해서 뷰를 생성하게 된다.
뷰 이름은 직접 또는 자동으로 설정될 수 있다.
뷰 이름 명시적 지정 : ModelAndView Class의 생성자
뷰 이름을 명시적으로 지정하려면 ModelAndView나 String을 리턴해야 한다.
ModelAndView를 리턴할 경우 ModelAndView Class의 생성자나, setViewName()메서드를 이용해서 뷰 이름을 지정할 수 있다. 아래의 코드는 ModelAndView Class의 생성자를 이용해서 뷰 이름을 지정한다.
@RequestMapping("/index/intdex.do")
public ModelAndView index() {
ModelAndView mav = new ModelAndView("index");
...
return mav;
}
뷰 이름 명시적 지정 : ModelAndView의 setViewName() 메서드
아래의 코드는 ModelAndView의 setViewName()메서드를 이용해서 뷰 이름을 지정한다.
@Controller
@RequestMapping("help/main.do")
public ModelAndView main() {
ModelAndView mav = new ModelAndView();
mav.setViewName("/help/main");
}
뷰 이름 명시적 지정 : String 리턴 타입
String 타입으로 리턴할 경우, 문자열 값이 뷰 이름으로 사용된다. 아래 코드는 String을 리턴하는 예를 보여준다.
@Controller
@RequestMapping("/help/main.do")
public String helpMain(ModelMap model) {
...
return "help/main";
}
뷰 이름 자동 지정
다음의 경우 RequestToViewName Translator를 이용해서 URL로부터 뷰 이름을 결정한다.
- 리턴 타입이 Model이나 Map인 경우
- 리턴 타입이 void이면서 ServletResponse나 HttpServletResponse 타입의 파라미터가 없는 경우
SPRING 설정 파일에 RequestToViewName Translataor 빈이 존재하지 않을 경우
기본적으로 DefaultRequestToViewNameTranslator를 사용한다.
이 클래스는 요청 URI로부터 맨앞의 슬래시("/")와 확장자를 제외한 나머지 부분을 뷰 이름으로 사용한다.
@RequestMapping("/search/game2.do")
public Map<String, Object> search() {
HaspMap<String, Object> model = new HashMap<String, Object>();
...
return model;
}
위 코드에서 뷰에 전달할 모델 데이터를 갖고 있는 Map을 리턴하고 있다.
DefaultRequestToViewNameTranslator 가 사용될 경우 다음과 같이 URL로부터 뷰 이름이 결정된다.
/search/game2.do 👉 search/game2
리다이렉트 뷰
뷰 이름에 "redirect:" 접두어를 붙이면, 지정한 페이지로 리다이렉트 된다.
리다이렉트 URL은 다음과 같이 두가지 방식으로 입력할 수 있다.
- redirect:/bbs/list - 현재 Servlet 컨텍스트에 대한 상대적인 경로로 리다이렉트
- redirect:http://host/bbs/list - 지정한 절대 URL로 리다이렉트
아래 코드는 "redirect:" 접두어를 사용하여 뷰 이름을 지정한 예이다.
ModelAndView mav = new ModelAndView();
mav.setViewName("redirect:/error.do");
return mav;
요약
뷰 이름은 직접 지정할 수 있고 자동으로 지정할 수있다.
직접 지정할 수 있는 방법은 setViewName()메서드, ModelAndView 클래스의 생성자, String타입으로 리턴하여 문자열 값을 뷰 이름으로 지정할 수 있는 방법까지 총 3가지 방법을 알아보았다.
자동 지정할 수 있는 방법은 리턴 타입이 Model, Map인 경우와 리턴타입이 void이면서 ServletResponse, HttpServletResponse타입의 파라미터가 없는 경우 RequestViewNameTranslator를 이용해서 URL로부터 뷰 이름을 결정한다.
'[SPRING]' 카테고리의 다른 글
Spring classpath 경로확인과 경로 지정하기 (0) | 2021.09.05 |
---|---|
스프링 공부 4일차. 모델 생성하기 (0) | 2021.08.30 |
스프링 공부 2일차. HTML폼과 커맨드 객체 (0) | 2021.08.24 |
SPRING의 MVC (0) | 2021.08.23 |