Deep Dive /Java Web /12-1

12-1. AbstractJackson2HttpMessageConverter → ObjectMapper: readValue()

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


시퀀스 다이어그램

sequenceDiagram participant RR as RequestResponseBodyMethodProcessor participant Conv as AbstractJackson2HttpMessageConverter participant Mapper as Jackson ObjectMapper participant DTO RR->>Conv: readWithMessageConverters(...) Conv->>Conv: readJavaType(javaType, inputMessage) Conv->>Mapper: reader().forType(javaType).readValue(...) Mapper-->>Conv: DTO 인스턴스 Conv-->>RR: DTO 반환 RR-->>DTO: 컨트롤러 파라미터 후보

핵심 코드 흐름

// AbstractJackson2HttpMessageConverter.java
@Override
public Object read(Type type, @Nullable Class<?> contextClass, HttpInputMessage inputMessage)
        throws IOException, HttpMessageNotReadableException {

    JavaType javaType = getJavaType(type, contextClass);
    return readJavaType(javaType, inputMessage);
}

private Object readJavaType(JavaType javaType, HttpInputMessage inputMessage) throws IOException {
    ObjectMapper objectMapper = selectObjectMapper(javaType.getRawClass(), contentType);
    ObjectReader objectReader = objectMapper.reader().forType(javaType);
    return objectReader.readValue(inputStream); // 핵심: JSON -> DTO
}

역직렬화 실패 시(JsonProcessingException 등)에는 HttpMessageNotReadableException으로 전환되어 상위 단계로 전달됩니다.


설계 포인트

  1. DispatcherServlet이 직접 JSON을 다루지 않고, Converter 전략에 위임합니다.
  2. 대상 타입(JavaType)에 맞는 ObjectMapper를 선택할 수 있습니다.
  3. 실패는 즉시 예외로 올려서 이후 검증/컨트롤러 진입을 막습니다.

탐구 질문

  1. DTO 생성자 파라미터 이름, record, @JsonCreator 설정 차이는 역직렬화 성공률에 어떤 영향을 줄까요?
  2. JSON 파싱 실패와 검증 실패는 둘 다 400 계열이지만, 의미상 어떻게 다를까요?
  3. Converter 단계에서 실패하면 Step 12-2(@Valid)는 실행될까요?