빠에야는 개발중

Controller의 String 리턴 본문

공부/스프링

Controller의 String 리턴

빠에야좋아 2018. 2. 5. 18:42

실습을 진행하면서 Controller의 메소드들 중 getBoard와 getBoardList의 리턴형이 ModelAndView였던 것을 String으로 통일시켜주는 부분이 있었다. 코드의 깔끔함이라는 관점에서는 납득을 하였지만, 정확히 어떻게 작동을 하는지는 확인해보지 않고 넘어갔었다. 이 부분을 짚고 넘어가고 싶었다.


getBoardList 메소드의 코드를 살펴보면

1
2
3
4
5
6
7
8
9
10
11
@RequestMapping("/getBoardList.do")
public String getBoardList(BoardVO vo, Model model) {
    if(vo.getSearchCondition() == null) {
        vo.setSearchCondition("TITLE");
    }
    if(vo.getSearchKeyword() == null) {
        vo.setSearchKeyword("");
    }
    model.addAttribute("boardList", boardService.getBoardList(vo));
    return "getBoardList.jsp";
}
cs

이렇게 "getBoardList.jsp"라는 문자열을 리턴하고 있다. 이것이 어떻게 View Resolver에게 전달될까?


스택 트레이스를 확인해보았다.

ViewNameMethodReturnValueHandler라는 클래스를 통과한다. 이 클래스의 메소드의 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
@Override
public void handleReturnValue(Object returnValue, MethodParameter returnType,
        ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
 
    if (returnValue instanceof CharSequence) {
        String viewName = returnValue.toString();
        mavContainer.setViewName(viewName);
        if (isRedirectViewName(viewName)) {
            mavContainer.setRedirectModelScenario(true);
        }
    }
//
cs

1
2
3
protected boolean isRedirectViewName(String viewName) {
    return (PatternMatchUtils.simpleMatch(this.redirectPatterns, viewName) || viewName.startsWith("redirect:"));
}
cs

리턴값이 문자 형태(CharSequence)라면 ModelAndViewContainer의 ViewName으로 설정해주는 부분이 있다. 여기서 "Redirect:"를 인지하여 리다이렉트 처리도 해준다.


그리고 RequestMappingHandlerAdaptor의 getModelAndView에서 다음과 같이 ModelAndView로 처리된다.

1
2
ModelMap model = mavContainer.getModel();
ModelAndView mav = new ModelAndView(mavContainer.getViewName(), model);
cs


결론적으로 String으로 값을 넘겨도 결국 ModelAndView로 다뤄진다는 것이다. 이제 궁금증이 해결되었다.

'공부 > 스프링' 카테고리의 다른 글

@Transactinal  (0) 2020.07.23
롬복(lombok)  (0) 2018.02.26
스프링 퀵 스타트 : chap 5-2  (0) 2018.02.05
스프링 퀵 스타트 : chap 5-1  (0) 2018.02.04
스프링 퀵 스타트 : chap 4-2  (1) 2018.02.01
Comments