-
ajax호출시 jsonView를 사용하는법웹 개발/Java, Spring 2023. 8. 2. 18:22
ajax 호출시 json데이터를 받는법
필자는 이제까진 1번 방법을 사용해왔으나, controller에서 응답으로 넘기고 싶은 데이터가 많아짐에 따라,
그에 유리한 2번 방법도 사용할 필요가 생겨, 관련해서 필요한 설정을 더해주고 프로젝트를 진행하였다.
1번)
@RequestBody 를 사용하는 방법
이 방법 같은 경우는 별도의 특별한 설정이 필요없었고 바로 되어서 간편했다.
컨트롤러 파일의 해당 url매핑 부분에 @RequestBody 어노테이션만 붙여주면 된다.
>>controller
@GetMapping(path="/bank/accountlist.json") @ResponseBody public List<BankAccountDto> jsonGetAccountlist(){ int totalAccountsCnt= bankAccountService.getAccountsTotalCnt(); List<BankAccountDto> accountlist= bankAccountService.getAccountList(0, totalAccountsCnt); return accountlist; }
2번)
ModelAndView의 view이름을 "jsonView"로 하여 ModelAndView객체를 반환하는 방법
( ,또는 String형인 뷰이름 "jsonView"을 반환하기)
이 방법 같은경우는 java config 파일에 추가로 설정이 필요했다. 필요한 bean 들을 등록해준다.
>> java config 파일
asis : InternalResourceViewResolver 객체를 return 하는 bean 만 등록되있다.
/* ../myweb/config/WebMvcContextConfiguration.java */ @Bean public InternalResourceViewResolver getInternalResourceViewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return resolver; }
tobe : 위에 더하여 MappingJackson2JsonView, BeanNameViewResolver bean 2개도 등록해준다.
/* ../myweb/config/WebMvcContextConfiguration.java */ @Bean public MappingJackson2JsonView jsonView() { MappingJackson2JsonView jsonview = new MappingJackson2JsonView(); jsonview.setContentType("application/json;charset=UTF-8"); return jsonview; } @Bean public BeanNameViewResolver beanNameResolver() { return new BeanNameViewResolver(); } @Bean public InternalResourceViewResolver getInternalResourceViewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return resolver; }
>>controller :
ModelAndView 객체를 반환하는 방법이 있고, String 을 반환하는 방법이 있다. 둘중에 편한것을 이용하면된다.
@GetMapping(path="/bank/jsonViewTEST.json") public ModelAndView jsonViewTEST(){ ModelAndView mv = new ModelAndView("jsonView"); int totalAccountsCnt= bankAccountService.getAccountsTotalCnt(); List<BankAccountDto> accountlist= bankAccountService.getAccountList(0, totalAccountsCnt); mv.addObject("accountlist",accountlist); return mv; } @GetMapping(path="/bank/jsonViewTEST2.json") public String jsonViewTEST2(ModelMap model){ int totalAccountsCnt= bankAccountService.getAccountsTotalCnt(); List<BankAccountDto> accountlist= bankAccountService.getAccountList(0, totalAccountsCnt); model.addAttribute("accountlist", accountlist); return "jsonView"; }
**참고
처음 WebMvcContextConfiguration.java 파일을 수정하고 controller에서도 수정하고 ajax를 호출해주는데
계속 에러가 찍혔다. 에러 내용을 보니 jsonView.jsp 를 찾을수 없다는 것이다.
당연히 jsonView.jsp라는 파일은 만들지 않았고, 왜 계속 jsonView.jsp 페이지로 가려는걸까 이것저것 고생을 하다가, 문득 혹시 뷰네임 "jsonView"로 이동하려해서 인거 아닐까 싶은 생각이 났다.
그러고보니 WebMvcContextConfiguration.java 파일에 기존에 있는 InternalResourceViewResolver 뷰 리졸버 때문에 해당 경로로 이동하려 하는 현상이 있는 듯 했다. 해서, BeanNameViewResolver도 등록해주어 InternalResourceViewResolver 는 우선순위가 나중으로 가게끔 해주어야 하나 싶어서 BeanNameViewResolver도 등록하였더니, 에러가 해결되었다.
결론 : bean 등록 할때, InternalResourceViewResolver 가 있다면, MappingJackson2JsonView 뿐만 아니라 BeanNameViewResolver 도 같이 등록해주어야 함.
'웹 개발 > Java, Spring' 카테고리의 다른 글
멀티쓰레드 (0) 2024.04.18 싱글톤 디자인패턴 (0) 2024.04.18 [ 스프링 퀵 스타트 -채규태 지음 ] 완독 시작 (0) 2023.07.21 jdbcTemplate vs mybatis vs JPA (0) 2023.06.26 Spring Bean (0) 2022.08.07