본문 바로가기

카테고리 없음

스프링 컨트롤러에서 리턴값 받은 후 스프링 흐름

📖 컨트롤러에서  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로 컨트롤러에서 받은 리턴 값을 전해준다

리턴값이 View인 경우
return 값이 view가 아닌 경우 mv에는 null

👉 return 값이 view가 아닐 때 null인 이유 

이미 HttpMessageConverter가 실행되어 응답했음

 

❓ 응답을 했는데도 DispatcherServlet으로 오는 이유

👉  @ResponseBody를 사용해도 요청 자체는 DispatcherServlet이 관리하며, 최종 응답을 HttpMessageConverter로 변환할 뿐이  요청 마무리는 아님, 따라서 DispatcherServlet으 돌아오고 viewResolver는 사용하지 않고  DispatcherServlet 가 최종 응답 후 마무리한다