📖 컨트롤러에서 DisPatcherServlet으로 return 값을 줄 때 처리해주는
HttpMessageConverter,ViewResolver에 대해서 알아 보았다
💠판단 기준
1️⃣ @ResponseBody 또는 @RestController가 붙어 있는가?
✅ 있다면 → HttpMessageConverter 사용 (뷰 없이 JSON/XML 변환)
❌ 없다면 → ViewResolver 사용 (뷰를 찾아 렌더링)
2️⃣ 반환 타입이 ResponseEntity인가?
✅ 맞다면 → HttpMessageConverter 사용 (HTTP 상태 코드 및 헤더 설정 가능)
3️⃣ 반환 타입이 String인가?
✅ @ResponseBody 없으면 → ViewResolver 사용 (뷰 이름으로 해석)
✅ @ResponseBody 있으면 → HttpMessageConverter 사용 (텍스트 그대로 반환)
📖 추가로 HttpServletResponse response 을 컨트롤러에서 직접 사용하면 DisPatcherServlet에 가지않고
바로 응답한다. DisPatcherServlet 무시!
📌HttpMessageConverter
DispatcherServlet이 @ResponseBody가 있는지 확인
HttpMessageConverter가 Map 객체를 JSON으로 변환
JSON 데이터를 HTTP 응답 본문(body)에 담아서 클라이언트에게 반환
💠HttpMessageConverter 종류
ByteArrayHttpMessageConverter
- byte[] Data를 처리한다.
- 대상 : byte[]
- MediaType : */*
- 반환 : application/octet-stream
StringHttpMessageConverter
- String Data를 처리한다.
- 대상 : String
- MediaType : */*
- 반환 : text/plain
MappingJackson2HttpMessageConverter
- JSON Data를 처리한다.
- 대상 : Object, HashMap
- MediaType : application/json
- 반환 : application/json
📌ViewResolver
ViewResolver는 기본적으로 뷰의 이름을 확인하고 이를 실제 뷰 리소스(예: Thymeleaf 템플릿 등) 변환
DisPatcherServlet이 view이름 전달해주면 해당하는 view파일 찾아서 렌더링 후 클라이언트에게 HTML페이지 반환
📖 로직 흐름
1️⃣ RequestMappingHandlerAdapter에서 최종적으로 InvocableHandlerMethod의 doInvoke()호출한 후 찾은 핸들러(컨트롤러) 실행한다
2️⃣ @ResponseBody인지 체크
> 해당 컨트롤러 실행 후 리턴 값을 받아서 체크한다
3️⃣ RequestMappingHandlerAdapter에서 DispatcherServlet로 컨트롤러에서 받은 리턴 값을 전해준다
👉 return 값이 view가 아닐 때 null인 이유
이미 HttpMessageConverter가 실행되어 응답했음
❓ 응답을 했는데도 DispatcherServlet으로 오는 이유
👉 @ResponseBody를 사용해도 요청 자체는 DispatcherServlet이 관리하며, 최종 응답을 HttpMessageConverter로 변환할 뿐이 요청 마무리는 아님, 따라서 DispatcherServlet으 돌아오고 viewResolver는 사용하지 않고 DispatcherServlet 가 최종 응답 후 마무리한다