Deep Dive /Java Web /17-R4

17-R4. HttpMessageConverter → HttpMessageConverter: JSON 직렬화

Jackson 기반 JSON 응답에서는 AbstractJackson2HttpMessageConverter.writeInternal(...) 안에서 ObjectWriter.writeValue(...)가 호출됩니다. 즉 실제 JSON 문자열 생성은 이 단계에서 일어납니다.


이번 단계의 역할 — 반환 객체가 JSON 바이트 스트림으로 바뀌는 실제 직렬화 단계

컨트롤러 반환 객체를 JSON 바이트 스트림으로 바꾸는 실제 직렬화 단계입니다.


호출 흐름 요약 — ObjectMapper 선택 → JsonGenerator 생성 → ObjectWriter 구성

  1. JSON 컨버터가 ObjectMapper를 선택합니다.
  2. JsonGenerator를 만듭니다.
  3. ObjectWriter를 구성합니다.
  4. objectWriter.writeValue(generator, value)가 실행됩니다.
  5. 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