Deep Dive /Java Web /17-R2

17-R2. DispatcherServlet → HandlerMethodReturnValueHandler: handleReturnValue()

REST 응답 경로의 핵심은 HandlerMethodReturnValueHandler가 컨트롤러 반환값을 처리하는 것입니다. Spring MVC에서는 RequestResponseBodyMethodProcessor가 대표적인 구현체입니다.


이번 단계의 역할 — 반환 객체를 HTTP 응답 본문으로 바꾸는 처리를 시작한다

반환 객체를 HTTP 응답 본문으로 바꾸는 처리를 시작하는 단계입니다.


호출 흐름 요약 — 처리기 탐색 → handleReturnValue() → setRequestHandled(true)

  1. ServletInvocableHandlerMethod.invokeAndHandle()가 반환값 처리기를 찾습니다.
  2. handleReturnValue(...)를 호출합니다.
  3. RequestResponseBodyMethodProcessormavContainer.setRequestHandled(true)를 설정합니다.
  4. 이후 메시지 컨버터 경로로 넘어갑니다.

호출 흐름 다이어그램 — RequestResponseBodyMethodProcessor가 ModelAndViewContainer에 표시를 남긴다

sequenceDiagram participant SIHM as ServletInvocableHandlerMethod participant Handler as RequestResponseBodyMethodProcessor participant MVC as ModelAndViewContainer SIHM->>Handler: handleReturnValue(...) Handler->>MVC: setRequestHandled(true)

핵심 코드 — handleReturnValue()가 반환값과 반환 타입을 함께 받는다

// 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);
}

코드 해설 — requestHandled=true는 이 요청이 더 이상 ViewResolver로 가지 않는다는 뜻이다

mavContainer.setRequestHandled(true)가 중요한 이유는, 이 요청은 더 이상 ViewResolver로 가지 않고 이미 응답 본문 작성으로 처리된다는 뜻이기 때문입니다.


설계 의도 — 뷰 경로와 본문 경로를 같은 파이프라인에서 갈라내는 신호를 남긴다

뷰 렌더링 경로와 응답 본문 경로를 같은 MVC 파이프라인 안에서 분기하기 위한 명확한 신호를 주는 단계입니다.


다음 단계 연결 — 17-R3 writeWithMessageConverters()로 본문을 쓰는 단계로 이어진다

다음 문서 17-R3에서는 메시지 컨버터가 실제 본문 쓰기를 수행하는 writeWithMessageConverters(...) 단계로 넘어갑니다.

← 이전: 17-R1. Controller → DispatcherServlet: Object / ResponseEntity 반환 | 다음: 17-R3. HandlerMethodReturnValueHandler → HttpMessageConverter