17-R4. HttpMessageConverter → HttpMessageConverter: JSON 직렬화
Jackson 기반 JSON 응답에서는 AbstractJackson2HttpMessageConverter.writeInternal(...) 안에서 ObjectWriter.writeValue(...)가 호출됩니다.
즉 실제 JSON 문자열 생성은 이 단계에서 일어납니다.
이번 단계의 역할
컨트롤러 반환 객체를 JSON 바이트 스트림으로 바꾸는 실제 직렬화 단계입니다.
호출 흐름 요약
- JSON 컨버터가
ObjectMapper를 선택합니다. JsonGenerator를 만듭니다.ObjectWriter를 구성합니다.objectWriter.writeValue(generator, value)가 실행됩니다.generator.flush()로 출력이 밀어집니다.
호출 흐름 다이어그램
sequenceDiagram
participant Conv as AbstractJackson2HttpMessageConverter
participant Mapper as ObjectMapper
participant Writer as ObjectWriter
participant Gen as JsonGenerator
Conv->>Mapper: selectObjectMapper(...)
Mapper-->>Conv: ObjectMapper
Conv->>Writer: objectMapper.writer()
Writer->>Gen: writeValue(generator, value)
핵심 코드
// AbstractJackson2HttpMessageConverter.java
ObjectMapper objectMapper = selectObjectMapper(clazz, contentType);
ObjectWriter objectWriter = (serializationView != null ?
objectMapper.writerWithView(serializationView) : objectMapper.writer());
objectWriter.writeValue(generator, value);
generator.flush();
코드 해설
이 단계는 Spring MVC가 아니라 Jackson 직렬화 계층이 주도권을 갖습니다. 즉 애플리케이션 객체가 실제 JSON 텍스트로 바뀌는 순간입니다.
설계 의도
응답 본문 생성은 메시지 컨버터가, 실제 JSON 직렬화는 Jackson이 담당하게 해 책임을 세분화한 구조입니다.
다음 단계 연결
다음 문서 17-R5에서는 직렬화된 JSON이 응답 본문 작성 완료 상태로 DispatcherServlet 흐름에 반영되는 과정을 봅니다.
← 이전: 17-R3. HandlerMethodReturnValueHandler → HttpMessageConverter | 다음: 17-R5. HttpMessageConverter → DispatcherServlet