
Jackson을 사용하여 Enum 타입 필드에 숫자가 매핑되는 문제를 해결하는 방법에 대해 좀 더 자세히 설명하겠습니다.
이 문제는 Enum을 직렬화하거나 역직렬화할 때 발생할 수 있는데, Jackson은 기본적으로 Enum을 숫자로 매핑하는 경향이 있습니다.
예를 들어, Enum 클래스의 각 항목이 내부적으로 인덱스를 가진다고 가정했을 때, JSON 데이터에서 숫자가 들어오면 그 숫자를 인덱스로 취급하여 Enum 값에 매핑하려고 합니다.
이 문제를 해결하기 위해 Jackson의 설정을 조정할 수 있습니다.
이때 사용하는 방법은 DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS를 true로 설정하는 것입니다.
이 설정을 사용하면, 숫자 값이 Enum에 매핑될 때 예외를 발생시켜, 숫자 값으로 Enum을 잘못 매핑하는 것을 방지할 수 있습니다.
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
final ObjectMapper objectMapper = new ObjectMapper();
// Enum 타입 필드에서 숫자 값이 매핑되는 것을 막음
objectMapper.configure(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS, true);
return objectMapper;
}
}
위 설정을 통해, JSON에서 Enum 값으로 숫자가 들어오는 경우, Jackson은 해당 값을 Enum에 매핑할 수 없다고 판단하고 예외를 발생시킵니다.
{
"enumField": 1
}
이 경우 EnumType에 해당하는 값이 숫자 1로 들어오면, Jackson은 이를 처리할 수 없고 예외를 발생시킵니다.
{
"enumField": "SECOND"
}
이 경우, "SECOND"라는 문자열이 EnumType.SECOND에 매핑되며 정상적으로 처리됩니다.
만약 요청 JSON에서 정의되지 않은 필드가 들어왔을 때, 이를 무시하고 싶다면 FAIL_ON_UNKNOWN_PROPERTIES를 false로 설정하여 Jackson이 예외를 발생시키지 않도록 할 수 있습니다.
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
이 설정을 통해, 불필요한 필드를 무시하고 매핑을 진행할 수 있습니다.