본문 바로가기

[SPRING]

스프링 공부 3일차. 컨트롤러 메서드의 리턴 타입

컨트롤러 메서드의 리턴 타입은 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로부터 뷰 이름을 결정한다.