Deep Dive /Java Web /17-R5

17-R5. HttpMessageConverter → DispatcherServlet: Response Body 작성 완료

메시지 컨버터의 write(...)가 끝나면, 응답 본문은 이미 HttpServletResponse에 기록된 상태입니다. 이제 DispatcherServlet은 더 이상 뷰 렌더링을 하지 않고 요청을 마무리합니다.


이번 단계의 역할

JSON 응답 본문 작성이 끝났음을 MVC 흐름에 반영하는 단계입니다.


호출 흐름 요약

  1. writeWithMessageConverters(...)가 적절한 컨버터의 write(...)를 실행합니다.
  2. 컨버터가 응답 출력 스트림에 JSON을 기록합니다.
  3. RequestResponseBodyMethodProcessor.handleReturnValue()가 종료됩니다.
  4. mavContainer.setRequestHandled(true) 상태 덕분에 View 렌더링은 생략됩니다.

호출 흐름 다이어그램

sequenceDiagram participant Conv as HttpMessageConverter participant Processor as RequestResponseBodyMethodProcessor participant DS as DispatcherServlet Conv-->>Processor: write complete Processor-->>DS: request handled

핵심 코드

// RequestResponseBodyMethodProcessor.java
mavContainer.setRequestHandled(true);
writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage);
// DispatcherServlet.java
if (mv != null && !mv.wasCleared()) {
    render(mv, request, response);
}
else {
    logger.trace("No view rendering, null ModelAndView returned.");
}

코드 해설

REST 응답에서는 requestHandled=true가 이미 설정되어 있기 때문에, DispatcherServlet은 ViewResolver로 내려가지 않습니다. 즉 응답 본문 쓰기가 완료되면 사실상 MVC 응답 처리도 끝난 것입니다.


설계 의도

응답 본문 방식과 뷰 렌더링 방식을 하나의 파이프라인 안에서 공존시키되, 둘이 겹치지 않게 명확히 분기하기 위한 구조입니다.


다음 단계 연결

다음 문서 17-R6에서는 이렇게 작성된 JSON 응답이 최종적으로 브라우저에 전달되는 마지막 단계를 정리합니다.

← 이전: 17-R4. HttpMessageConverter → HttpMessageConverter: JSON 직렬화 | 다음: 17-R6. DispatcherServlet → Browser: HTTP Response (JSON)