17-R2. DispatcherServlet → HandlerMethodReturnValueHandler: handleReturnValue()
REST 응답 경로의 핵심은 HandlerMethodReturnValueHandler가 컨트롤러 반환값을 처리하는 것입니다.
Spring MVC에서는 RequestResponseBodyMethodProcessor가 대표적인 구현체입니다.
이번 단계의 역할
반환 객체를 HTTP 응답 본문으로 바꾸는 처리를 시작하는 단계입니다.
호출 흐름 요약
ServletInvocableHandlerMethod.invokeAndHandle()가 반환값 처리기를 찾습니다.handleReturnValue(...)를 호출합니다.RequestResponseBodyMethodProcessor가mavContainer.setRequestHandled(true)를 설정합니다.- 이후 메시지 컨버터 경로로 넘어갑니다.
호출 흐름 다이어그램
sequenceDiagram
participant SIHM as ServletInvocableHandlerMethod
participant Handler as RequestResponseBodyMethodProcessor
participant MVC as ModelAndViewContainer
SIHM->>Handler: handleReturnValue(...)
Handler->>MVC: setRequestHandled(true)
핵심 코드
// ServletInvocableHandlerMethod.java
this.returnValueHandlers.handleReturnValue(
returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
// RequestResponseBodyMethodProcessor.java
public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws IOException {
mavContainer.setRequestHandled(true);
writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage);
}
코드 해설
mavContainer.setRequestHandled(true)가 중요한 이유는, 이 요청은 더 이상 ViewResolver로 가지 않고 이미 응답 본문 작성으로 처리된다는 뜻이기 때문입니다.
설계 의도
뷰 렌더링 경로와 응답 본문 경로를 같은 MVC 파이프라인 안에서 분기하기 위한 명확한 신호를 주는 단계입니다.
다음 단계 연결
다음 문서 17-R3에서는 메시지 컨버터가 실제 본문 쓰기를 수행하는 writeWithMessageConverters(...) 단계로 넘어갑니다.
← 이전: 17-R1. Controller → DispatcherServlet: Object / ResponseEntity 반환 | 다음: 17-R3. HandlerMethodReturnValueHandler → HttpMessageConverter