Jackson을 사용하여 Enum 필드에서 숫자 매핑 방지하기

궁금하면 500원·2024년 11월 7일
0

미생의 개발 이야기

목록 보기
21/59

Jackson을 사용하여 Enum 타입 필드에 숫자가 매핑되는 문제를 해결하는 방법에 대해 좀 더 자세히 설명하겠습니다.

이 문제는 Enum을 직렬화하거나 역직렬화할 때 발생할 수 있는데, Jackson은 기본적으로 Enum을 숫자로 매핑하는 경향이 있습니다.

예를 들어, Enum 클래스의 각 항목이 내부적으로 인덱스를 가진다고 가정했을 때, JSON 데이터에서 숫자가 들어오면 그 숫자를 인덱스로 취급하여 Enum 값에 매핑하려고 합니다.

이 문제를 해결하기 위해 Jackson의 설정을 조정할 수 있습니다.

이때 사용하는 방법은 DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS를 true로 설정하는 것입니다.

이 설정을 사용하면, 숫자 값이 Enum에 매핑될 때 예외를 발생시켜, 숫자 값으로 Enum을 잘못 매핑하는 것을 방지할 수 있습니다.

JacksonConfig 설정을 통한 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에 매핑할 수 없다고 판단하고 예외를 발생시킵니다.

예시 1: 잘못된 요청 (숫자로 Enum 매핑 시도)

{
    "enumField": 1
}

이 경우 EnumType에 해당하는 값이 숫자 1로 들어오면, Jackson은 이를 처리할 수 없고 예외를 발생시킵니다.

예시 2: 올바른 요청 (Enum 값 사용)

{
    "enumField": "SECOND"
}

이 경우, "SECOND"라는 문자열이 EnumType.SECOND에 매핑되며 정상적으로 처리됩니다.

추가적인 옵션: FAIL_ON_UNKNOWN_PROPERTIES

만약 요청 JSON에서 정의되지 않은 필드가 들어왔을 때, 이를 무시하고 싶다면 FAIL_ON_UNKNOWN_PROPERTIES를 false로 설정하여 Jackson이 예외를 발생시키지 않도록 할 수 있습니다.

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

이 설정을 통해, 불필요한 필드를 무시하고 매핑을 진행할 수 있습니다.

profile
꾸준히, 의미있는 사이드 프로젝트 경험과 문제해결 과정을 기록하기 위한 공간입니다.

0개의 댓글