Deep Dive /Java Web /12-1

12-1. AbstractJackson2HttpMessageConverter → ObjectMapper: readValue()

이 단계는 HTTP 본문(JSON)을 DTO 객체로 역직렬화하는 단계입니다.


이번 단계의 역할 — 요청 본문에서 DTO 후보를 만드는 단계

컨트롤러 파라미터 후보가 될 DTO를 요청 본문에서 생성하는 단계입니다.


호출 흐름 요약 — JavaType 계산 → ObjectMapper.reader().forType(…) 구성

  1. RequestResponseBodyMethodProcessor가 메시지 컨버터 읽기를 요청합니다.
  2. AbstractJackson2HttpMessageConverterJavaType을 계산합니다.
  3. ObjectMapper.reader().forType(...)를 구성합니다.
  4. readValue(...)가 실행되어 DTO 객체가 만들어집니다.

호출 흐름 다이어그램 — readWithMessageConverters()가 ObjectMapper를 거쳐 DTO를 돌려준다

sequenceDiagram participant RR as RequestResponseBodyMethodProcessor participant Conv as AbstractJackson2HttpMessageConverter participant Mapper as ObjectMapper participant DTO RR->>Conv: readWithMessageConverters(...) Conv->>Mapper: reader().forType(javaType).readValue(...) Mapper-->>Conv: DTO Conv-->>RR: DTO RR-->>DTO: 파라미터 후보

핵심 코드 — getJavaType()으로 타입을 정하고 ObjectReader.readValue()로 읽는다

// AbstractJackson2HttpMessageConverter.java
JavaType javaType = getJavaType(type, contextClass);
ObjectReader objectReader = objectMapper.reader().forType(javaType);
return objectReader.readValue(inputStream);

코드 해설 — 순수 역직렬화 단계이고 검증은 아직 시작되지 않았다

이 단계는 순수 역직렬화 단계입니다. 아직 검증은 시작되지 않았고, JSON이 정상적으로 객체로 바뀌어야만 다음 단계로 넘어갈 수 있습니다.


설계 의도 — 역직렬화와 검증을 나눠 파싱 실패를 먼저 드러낸다

역직렬화와 검증을 분리해, 파싱 실패를 먼저 드러내고 이후 단계 책임을 명확히 나누기 위한 구조입니다.


다음 단계 연결 — 12-2 WebDataBinder와 SmartValidator의 검증으로 이어진다

다음 문서 12-2에서는 생성된 DTO에 대해 WebDataBinderSmartValidator가 검증을 수행하는 과정을 봅니다.

← 이전: 12. DispatcherServlet → HandlerMethodArgumentResolver | 다음: 12-2. WebDataBinder → SmartValidator