728x90
@RequestBody를 사용하면
MappingJackson2HttpMessageConverter가 ObjectMapper를 통해 값을 바인딩해줍니다.
즉 @RequestBody의 바인딩 조건은 ObjectMapper의 바인딩 조건과 동일합니다.
해당 과정은 맨 마지막에 자세히 살펴보도록 하겠습니다.
우선 기본적인 상황에서 바인딩이 되는 조건은 다음과 같습니다.
가능한 조건
(모든 접근제어자) 기본생성자 + (public) Getter 가능
(모든 접근제어자) 기본생성자 + (모든 접근제어자) Setter 가능
불가능한 조건
기본생성자만 있는 경우
기본생성자가 없는 경우
(모든 접근제어자) 기본생성자 + (public이 아닌 다른 접근제어자) Getter
ObjectMapper 조건 변경하기
objectMapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
objectMapper.setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE);
objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
objectMapper.registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES));
이외에도 여러 설정들이 있습니다.
위 설정은 기본 생성자 없이 Getter만으로도 바인딩이 되도록 하는 설정입니다.
(만약 생성자에 인자가 단 1개인 경우 @JsonCreator 를 붙여주어야 하며,
1개보다 많은 경우에는 잘 작동합니다)
@RequestBody 기본 생성자 없이 사용하기
@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
// Java time module
JavaTimeModule jtm = new JavaTimeModule();
jtm.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ISO_DATE_TIME));
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder() {
@Override
public void configure(ObjectMapper objectMapper) {
super.configure(objectMapper);
objectMapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
objectMapper.setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE);
objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
objectMapper.registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES));
}
};
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
builder.modulesToInstall(jtm);
return builder;
}
자세히 살펴보기
@RequestBody를 사용하면 ArgumentResolver로 RequestResponseBodyMethodProcessor가 사용됩니다.
즉 내부적으로 ObjectMapper를 사용하는 것을 확인할 수 있습니다.
Reference
728x90
'🏝️ Spring > Web MVC' 카테고리의 다른 글
[Spring MVC] 스프링 인터셉터 적용 시 NOT FOUND가 발생하지 않는 경우 (0) | 2023.01.21 |
---|---|
[Spring MVC] @Controller에서 ResponseEntity를 사용하면 어떻게 되나? (0) | 2022.07.04 |
[Spring MVC] - JSON으로 List를 매핑하는 방법 (0) | 2022.06.27 |
[MVC] 예외 처리 - API 예외 처리 (@ExceptionHandler, @ControllerAdvice) (0) | 2022.02.19 |
[MVC] 예외 처리 - 스프링 부트에서의 오류 페이지 (0) | 2022.01.18 |