Deep Dive /Java Web /17-R3

17-R3. HandlerMethodReturnValueHandler → HttpMessageConverter: writeWithMessageConverters()

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


이번 단계의 역할 — 반환 객체와 미디어 타입에 맞는 컨버터를 고르는 단계

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


호출 흐름 요약 — handleReturnValue() → writeWithMessageConverters() → 컨버터 목록 순회

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

호출 흐름 다이어그램 — AbstractMessageConverterMethodProcessor가 HttpMessageConverter의 write를 부른다

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

핵심 코드 — converterTypeToUse가 BASE·GENERIC·SMART 중 어느 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;
}

코드 해설 — 반환 타입·Accept·Content-Type을 함께 보고 컨버터 전략으로 형식을 정한다

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


설계 의도 — 본문 직렬화를 전략 객체로 나눠 JSON·XML·바이너리를 같은 방식으로 다룬다

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


다음 단계 연결 — 17-R4 Jackson이 ObjectWriter로 직렬화하는 장면으로 이어진다

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

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