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