빠에야는 개발중
Controller의 String 리턴 본문
실습을 진행하면서 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