Deep Dive /Java Web /17-R3

17-R3. HandlerMethodReturnValueHandler → HttpMessageConverter: writeWithMessageConverters()

RequestResponseBodyMethodProcessor는 최종적으로 메시지 컨버터를 호출해 응답 본문을 씁니다. 이 메서드가 REST 응답 작성의 핵심 허브입니다.


이번 단계의 역할

반환 객체와 응답 미디어 타입에 맞는 HttpMessageConverter를 선택하고 본문 쓰기를 시작하는 단계입니다.


호출 흐름 요약

  1. RequestResponseBodyMethodProcessor.handleReturnValue()가 호출됩니다.
  2. writeWithMessageConverters(...)가 실행됩니다.
  3. Spring이 컨버터 목록을 순회하며 적합한 컨버터를 찾습니다.
  4. 선택된 컨버터의 write(...)가 호출됩니다.

호출 흐름 다이어그램

sequenceDiagram participant Processor as RequestResponseBodyMethodProcessor participant AMC as AbstractMessageConverterMethodProcessor participant Conv as HttpMessageConverter Processor->>AMC: writeWithMessageConverters(...) AMC->>Conv: write(...)

핵심 코드

// RequestResponseBodyMethodProcessor.java
writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage);
// AbstractMessageConverterMethodProcessor.java
if (converterTypeToUse != null) {
    switch (converterTypeToUse) {
        case BASE -> converter.write(body, selectedMediaType, outputMessage);
        case GENERIC -> ((GenericHttpMessageConverter) converter).write(...);
        case SMART -> ((SmartHttpMessageConverter) converter).write(...);
    }
    return;
}

코드 해설

Spring은 반환값 타입, Accept 헤더, Content-Type 등을 함께 고려해 적절한 메시지 컨버터를 선택합니다. 즉 단순히 JSON으로 고정된 것이 아니라, 컨버터 전략으로 응답 형식을 결정합니다.


설계 의도

응답 본문 직렬화를 전략 객체로 분리해 JSON, XML, 문자열, 바이너리 등 다양한 응답 형식을 공통 방식으로 처리하려는 구조입니다.


다음 단계 연결

다음 문서 17-R4에서는 Jackson 기반 컨버터가 실제로 ObjectWriter.writeValue(...)를 호출해 JSON 직렬화를 수행하는 장면을 봅니다.

← 이전: 17-R2. DispatcherServlet → HandlerMethodReturnValueHandler | 다음: 17-R4. HttpMessageConverter → HttpMessageConverter: JSON 직렬화