spring mvc 직렬화

ttomy·2023년 4월 28일
0

responseEntity, @responseBody

  • @responseBody
    붙이면 viewResolver가 아니라 httpMessageConverter가 관여한다.
    자바 객체를 응답의 body로 만들어 보낼 수 있게해준다.

  • responseEntity를 통해 응답을 반환하면 @ResponseBody가 붙지 않은 컨트롤러에서도 view가 아닌 응답을 줄 수 있다.

spring에서 어떻게 직렬화 하나


@ResponseBody 사용 시, 리턴 객체가 HttpMessageConverter를 통해 string, json으로 변환되어 응답된다.
이 때 ObjectMapper를 통해 직렬화/역직렬화 한다.

이 과정에서 직렬화/역직렬화 할 객체의 변수가 private이면서 getter()도 없는 바인딩이 되지 않는다. -> 리플렉션을 이용한다고 하는데 추후에 공부해봐야겠다.

참고: https://ksh-coding.tistory.com/90
https://itvillage.tistory.com/66

dispatcherServlet은 controller가 view이름을 반환하는 거랑, @ResponseBody가 붙은 거랑 어떻게 다르게 처리하나?

view의 경우,
dispatcherServlet.doService() -> doDispatch()에서 handler매핑, handlerAdapter로 요청 처리해 ModelAndView받음 -> processDispatchResult()의 render()에서 viewResolver이용해 뷰로 반환하거나 예외발생

이게 @ResponseBody가 붙으면 매핑되는 handlerAdapter가 다르다.
@ResponseBody가 붙으면 handler는 RequestResponseBodyMethodProcessor가 된다.
여기서는 viewResolver가 아니라 HttpMessageConverter가 동작한다.
view로 반환될 때와는 다르게 ModelAndView변수인 mv가 null인 상태로
processDispatchResult()가 실행된다.

  • 디버깅한 모습


    mv가 null이면 위 이미지처럼 processDispatchResult의 에서 render()과정을 거치지 않는다는 게 다르다.

0개의 댓글