[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 로 이렇게 잘 동작하는걸까?
위 메스드에서 "com.fasterxml.jackson.datatype.jsr310.JavaTimeModule"
클래스가 존재하는 경우, JavaTimeModule 을 등록하고 있다.
찾았다... 요놈!! 👀
위 메스드에서 우리는 아래 설정들이 false가 되는 것을 알 수 있다. 아래 필드들은 위 configuration가 true 일 경우에 아래와 같은 케이스가 발생한다.
DEFAULT_VIEW_INCLUSION
: 하나의 POJO를 여러 곳에서 사용할때, 하지만 특정 저장 필드는 특정한 곳에서만 사용하거나, 사용하지 않는 차이를 주기 위해서 사용
FAIL_ON_UNKNOWN_PROPERTIES
: 역직렬화 시에 정의되지 않은 필드가 있는 경우 에러 처리
찾았다... 요놈2!! 👀
Jackson2ObjectMapperBuilder Bean 은 어떤 Configuration 을 가지고 Bean 으로 등록되는 건지 살펴보자.
TIMESTAMPS 찍는 것을 false 처리하고 있다.
Spring Boot 기본 ObjectMapper 에는 통상적(?) 으로 필요한 설정들이 모두 추가되어있다. 그거 그냥 갖다 쓸 걸...😩
configureFeature(objectMapper, MapperFeature.DEFAULT_VIEW_INCLUSION, false)
modulesToRegister.set(javaTimeModule.getTypeId(), javaTimeModule)
featureDefaults.put(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
좋은 내용 잘 보고 갑니다!!