컨트롤러 메서드는 ModelAndView를 비롯한 몇 가지 리턴 타입을 가질 수 있으며, 이들 리턴 타입은 다음과 같다.

- ModelAndView를 리턴할 경우 ModelAndView Class의 생성자나 setViewName() 메서드를 이용해서 뷰 이름을 지정할 수 있다.
- String 타입을 리턴할 경우, 문자열 값이 뷰 이름으로 사용된다.
@RequestMapping 메서드가 ModelAndView, Model, Map을 리턴하는 경우 이들에 담긴 모델 데이터가 뷰에 전달된다.
또한, 추가로 다음의 항목도 뷰에 함께 모델로 전달된다.
- 커맨드 객체(JavaBean)
- @ModelAttribute Annotation이 적용된 메서드가 리턴한 객체
- 메서드의 Map, Model, ModelMap 타입의 파라미터를 통해 설정된 모델
ex)
@ModelAttribute("searchTypeList")
public List<SearchType> referenceSearchTypeList() {
List<SearchType> options = new ArrayList<SearchType>();
options.add(new SearchType(1, "전체"));
options.add(new SearchType(2, "아이템"));
options.add(new SearchType(3, "캐릭터"));
return options;
}
@RequestMapping("/search/game.do")
public ModelAndView search(@ModelAttribute("command") SearchCommand command, ModelMap model) {
String[] queryList = getPopularQueryList();
model.addAttribute("popularQueryList", queryList);
ModelAndView mav = new ModelAndView("search/game");
SearchResult result = searchService.search(command);
mav.addObject("searchResult", result);
return mav;
}
}
- @ModelAttribute Annotation이 적용된 referenceSearchTypeList() 메서드가 리턴한 모델 객체는’searchTypeList’라는 이름으로 뷰에 전달된다.
- @RequestMapping Annotation이 적용된 search() 메서드는 파라미터로 커맨드 객체와 ModelMap 객체를 전달받는다.
- search() 메서드 내부에서는 ModelMap 타입 파라미터인 model을 이용해서 ‘popularQueryList’ 이름의 모델 객체를 뷰에
전달한다. - 내부적으로 ModelAndView 타입의 mav 객체를 만든 뒤 mav를 이용해서 'searchResult’라는 이름의 모델 객체를 뷰에 전달한다.
- 모델 객체는 모두 서로 다른 방법으로 생성되었지만, DispatcherServlet은 이들 모델 객체에 저장된 모델 데이터를 모두 뷰에 전달한다.
Map, Model, ModelMap을 이용하면 뷰에 전달할 모델을 생성할 수 있다. 첫 번째 방법은 이들 세 가지 타입 중 한 가지를 파라미터로 전달 받는 것이다.

두 번째 방법은 Map과 Model을 리턴하는 것이다.
둘은 모두 Interface이기 때문에 실제로는 Interface를 구현한 Class의 객체를 생성해서 리턴하면 된다.
@RequestMapping("/search1.do")
public Map<String, Object> search1(Map model){
...
HashMap<String, Object> model = new HashMap<String, Object>();
model.put("result", searchResult);
return model;
}
@RequestMapping("/search2.do")
public Model search1(Model model){
...
Model model = new ExtendedModelMap();
model.put("result", searchResult);
return model;
}
SPRING은 org.springframework.ui.Model Interface의 구현 Class인 ExtendedModelMap Class를 동일한 패키지에 제공하고 있으므로, ExtendedModelMap Class를 이용해서 모델을 설정하면 된다. Map의 경우 많이 사용하 는java.util.HashMap Class를 이용해서 모델을 설정한다.
Model Interface의 주요 메서드
org.springframework.ui.Model Interface는 모델을 설정할 수 있도록 다음과 같은 메서드를 제공하고 있다.
- Model addAttrubute(String name, Object value)
: value 객체를 name 이름으로 추가한다. 뷰 Code에서는 name으로 지정한 이름을 통해서 value를 사용한다… - Model addAttrubute(Object value)
: value를 추가한다. value의 패키지 이름을 제외한 단순 Class 이름을 모델 이름으로 사용한다. 이 때 첫 글자는 소문자로 처리한다. value가 배열이거나 컬렉션인 경우 첫 번째 원소의 Class 이름 뒤에 "List"를 붙인 걸 모델 이름으로 사용한다. 이 경우에도 Class 이름의 첫 자는 소문자로 처리한다. - Model addAllAttrubutes(Collection<?> values)
: addAttribute(Object value) 메서드를 이용해서 컬렉션에 포함된 객체들을 차례대로 추가한다. - Model addAllAttrubutes(Map<String,?> attributes)
: Map에 포함된 <키,값>에 대해 키를 모델 이름으로 사용해서 값을 모델로 추가한다. - Model mergeAttrubutes(Map<String,?> attributes)
: Map에 포함된 <키,값>을 현재 모델에 추가한다. 단, 키와 동일한 이름을 갖는 모델 객체가 존재하지 않는 경우에만 추가된다. - boolean containsAttribute(String name)
: 지정한 이름의 모델 객체를 포함하고 있는 경우 true를 리턴한다.
@ModelAttribute Annotation을 사용하면 커맨드 객체의 초기화 작업을 수행할 수도 있다.
예를 들어, GET 요청시에는 폼의 특정 값을 미리 초기화하고 POST 요청시에는 폼에 입력한 값을 커맨드 객체로
받아야 한다고 해 보자. 이런 경우
@ModelAttribute Annotation을 사용하면 다음과 같이 GET 요청과 POST 요청에 대해 알맞게 커맨드 객체를
초기화 할 수 있다. 아래 Code는 @ModelAttribute Annotation의 사용 예를 보여주고 있다.

formBacking() 메서드의 @ModelAttribute Annotation 값과 submit() 메서드의 파라미터에서 사용된 @ModelAttribute Annotation의 값이 'command’로 동일하다는 것이다. submit() 메서드는 POST 요청을 처리하도록
되어 있는데, POST 요청이 전송될 경우 formBacking() 메서드가 생성한 MemberInfo 객체는 'command’라는 이름의 모델 객체로 저장되며, 이렇게 생성된 ‘command’ MemberInfo 객체는 submit() 메서드의 동일한 모델 이름을 갖는 커맨드 객체 (첫 번째 파라미터)로 전달된다.
'Java > SPRING' 카테고리의 다른 글
스프링 프레임워크[Spring Framework] @PathVariable 어노텐션 (0) | 2021.12.23 |
---|---|
스프링 프레임워크 [Spring Fremawork] 요청 URI 매칭 (0) | 2021.12.23 |
스프링 프레임워크 [Spring Framework] Servlet API (0) | 2021.12.23 |
스프링 프레임워크 [Spring Framework] @RequestHeader 해더 어노텐션 (0) | 2021.12.23 |
스프링 프레임워크 [Spring Framework] COOKIE 쿠키 객체 (0) | 2021.12.23 |