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으로 전환되어 상위 단계로 전달됩니다.
설계 포인트
- DispatcherServlet이 직접 JSON을 다루지 않고, Converter 전략에 위임합니다.
- 대상 타입(JavaType)에 맞는 ObjectMapper를 선택할 수 있습니다.
- 실패는 즉시 예외로 올려서 이후 검증/컨트롤러 진입을 막습니다.
탐구 질문
- DTO 생성자 파라미터 이름, record, @JsonCreator 설정 차이는 역직렬화 성공률에 어떤 영향을 줄까요?
- JSON 파싱 실패와 검증 실패는 둘 다 400 계열이지만, 의미상 어떻게 다를까요?
- Converter 단계에서 실패하면 Step 12-2(@Valid)는 실행될까요?