[Jackson] 기본 ObjectMapper 의 configuration 을 알아보자

Hocaron·2024년 3월 14일
2

Spring

목록 보기
43/44
post-custom-banner

[Spring] 캐시매니저를 Redis 로 전환해보자 포스팅에서 ObjectMapper 를 따로 생성하는 경우, FAIL_ON_UNKNOWN_PROPERTIES 기본설정이 true 라서 정의되지 않은 필드 추가시에 예외가 발생하였다. 또한, LocalDateTime 역직렬화도 불가능해 따로 TimeModule 을 등록해주었어야 했다.

@RequiredArgsConstructor
public class CacheConfig {

    private final ObjectMapper objectMapper; // 🔥🔥🔥 기본 ObjectMapper 주입

    private RedisCacheConfiguration createRedisCacheConfiguration(CacheType cacheType) {

        return RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.of(cacheType.getExpireAfterWrite(), cacheType.getExpireTimeUnit()))
                .serializeKeysWith(fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(fromSerializer(new Jackson2JsonRedisSerializer<>(objectMapper, cacheType.getClazz())))
                .disableCachingNullValues();
    }
}

그런데 Spring Boot 기본 ObjectMapper를 사용하면 필드 추가 시에도 에러를 뱉지 않고 FAIL_ON_UNKNOWN_PROPERTIES 설정이 false 로 된 것처럼 정상 동작한다. LocalDateTime 도 정상적으로 역직렬화되고 있다.

Spring Boot 기본 ObjectMapper 는 어떤 설정이 되어있길래 기본 ObjectMapper 로 이렇게 잘 동작하는걸까?

Spring Boot 에서 ObjectMapper 가 생성되는 과정

Jackson2ObjectMapperBuilder 로 OjbectMapper를 생성한다

  • ObjectMapper를 재정의하지 않았을 때만 동작한다.

Jackson2ObjectMapperBuilder.configure() 는 configuration을 한다.

  • ObjectMapper Null 여부 체크
  • ObjectMapper에 modules(Jackson의 확장을 위한 간단한 인터페이스) 등록
  • DateFormat 등록
  • Locale 등록
  • TimeZone 등록
  • AnnotationIntrospector(class에 붙어있는 @JsonDeserialize 이런 어노테이션 체커) 등록
  • propertyNamingStrategy(fields 네이밍 룰) 등록
  • serializationInclusion(필드 포함 여부, null, empty 등) 등록
  • Filter와 mixin 등록
  • Visibility(어떤 접근제한자를 이용하여 직렬화/역직렬화할지 선택) 세팅
  • customizeDefaultFeatures(objectMapper)

🙌 Jackson2ObjectMapperBuilder.registerWellKnownModulesIfAvailable() 를 들어가보면

위 메스드에서 "com.fasterxml.jackson.datatype.jsr310.JavaTimeModule" 클래스가 존재하는 경우, JavaTimeModule 을 등록하고 있다.

찾았다... 요놈!! 👀

🙌 Jackson2ObjectMapperBuilder.customizeDefaultFeatures() 를 들어가보면

위 메스드에서 우리는 아래 설정들이 false가 되는 것을 알 수 있다. 아래 필드들은 위 configuration가 true 일 경우에 아래와 같은 케이스가 발생한다.

DEFAULT_VIEW_INCLUSION : 하나의 POJO를 여러 곳에서 사용할때, 하지만 특정 저장 필드는 특정한 곳에서만 사용하거나, 사용하지 않는 차이를 주기 위해서 사용
FAIL_ON_UNKNOWN_PROPERTIES : 역직렬화 시에 정의되지 않은 필드가 있는 경우 에러 처리

찾았다... 요놈2!! 👀

Jackson2ObjectMapperBuilder Bean 등록

Jackson2ObjectMapperBuilder Bean 은 어떤 Configuration 을 가지고 Bean 으로 등록되는 건지 살펴보자.

Jackson2ObjectMapperBuilderCustomizer.customize()

TIMESTAMPS 찍는 것을 false 처리하고 있다.

결론

Spring Boot 기본 ObjectMapper 에는 통상적(?) 으로 필요한 설정들이 모두 추가되어있다. 그거 그냥 갖다 쓸 걸...😩

정리

  • Spring Boot의 ObjectMapper 기본 세팅은 다음과 같다.
    • configureFeature(objectMapper, MapperFeature.DEFAULT_VIEW_INCLUSION, false)
    • modulesToRegister.set(javaTimeModule.getTypeId(), javaTimeModule)
    • featureDefaults.put(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
  • 커스텀하게 ObjectMapper 설정할 필요가 없는 경우에는 Spring Boot 기본 ObjectMapper 를 사용해도 좋을 것 같다.

References

profile
기록을 통한 성장을
post-custom-banner

2개의 댓글

comment-user-thumbnail
2024년 4월 26일

좋은 내용 잘 보고 갑니다!!

1개의 답글