Web개발을 할 때 ajax를 사용해서 통신하는 경우가 매우 많다.
클라이언트에서 Spring Controller로 ajax 등의 요청을 했을 때, json형식으로 return 받기 위해서는 여러 방법이 있을 수 있다. 그 중 두 가지 방법이 주로 쓰인다.
1. Controller return type을 String으로 하고, 별도의 Json API를 사용해 parsing해서 json 형식으로 return 해준다.
2. MappingJackson2JsonView를 사용해서 ModelAndView를 json 형식으로 반환해 준다.
1번은 Gson 등 Json API들을 사용해서 적당히 Parsing하면 될 것이고, 지금 알아볼 것은 2번 방법이다.
별도의 처리 없이 컨트롤러에서 ModelAndView를 넘기면 당연히 안된다.
Spring Bean 설정 없이 구글링으로 ModelAndView mv = new ModelAndView("jsonView") 와 같은 소스를 긁어오면 아래와 같은 에러를 볼 수 있을 것이다.
Error resolving template "jsonView", template might not exist or might not be accessible by any of the configured Template Resolvers
방법은 간단하다.
1) MappingJackson2JsonView 형식의 jsonView를 Spring Bean으로 등록한다.
- 일반적인 Spring 이라면 DispatcherServlet에 설정
1 2 3 4 | <bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"> <property name="contentType" value="application/json;charset=UTF-8"> </property> </bean> | cs |
- Spring boot를 사용하고 따로 DispatcherServlet xml을 사용해서 설정하지 않는다면, @Configuration 을 붙인 WebConfig 파일에서 Bean으로 등록
1 2 3 4 | @Bean MappingJackson2JsonView jsonView(){ return new MappingJackson2JsonView(); } | cs |
2) Controller에서 return할 ModelAndView를 생성 할 때 View를 "jsonView"로 설정
(예시)
1 2 3 4 5 6 7 8 9 10 11 12 | ModelAndView mv = new ModelAndView("jsonView"); userVO.setOrderBy(orderDir); userVO.setOrderId(orderColNm); List<UserVO> userList = userMgmtSvc.selectUserList(userVO); int totalCnt = userMgmtSvc.selectUserListCount(userVO); mv.addObject("recordsTotal", totalCnt); mv.addObject("recordsFiltered", totalCnt); mv.addObject("data", userList); return mv; | cs |
3) 클라이언트에서 Response가 json 형식으로 잘 오는것을 확인