17-R3. HandlerMethodReturnValueHandler → HttpMessageConverter: writeWithMessageConverters()
RequestResponseBodyMethodProcessor는 최종적으로 메시지 컨버터를 호출해 응답 본문을 씁니다.
이 메서드가 REST 응답 작성의 핵심 허브입니다.
이번 단계의 역할
반환 객체와 응답 미디어 타입에 맞는 HttpMessageConverter를 선택하고 본문 쓰기를 시작하는 단계입니다.
호출 흐름 요약
RequestResponseBodyMethodProcessor.handleReturnValue()가 호출됩니다.writeWithMessageConverters(...)가 실행됩니다.- Spring이 컨버터 목록을 순회하며 적합한 컨버터를 찾습니다.
- 선택된 컨버터의
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 직렬화