프로그래밍 언어/JAVA, SPRING

[SPRING BOOT] UnrecognizedPropertyException 해결하기

doomole 2024. 11. 26. 15:07
728x90

 

 

개요

Spring Boot를 사용하며 JSON 데이터를 직렬화/역직렬화할 때, UnrecognizedPropertyException이 발생하는 경우가 있다.

이 예외는 Jackson 라이브러리가 JSON을 자바 객체로 변환하는 과정에서 예상하지 못한 필드가 발견되었을 때 발생하는데 이를 해결하는 방법에 대해서 설명하고자 한다.

 



문제 상황

ResponseVo라는 클래스가 아래와 같이 정의되어 있을 때, JSON데이터가 정의되어 있지 않은 필드를 담고 있을 경우 에러가 발생한다.

@Data
public class ResponseVo {
	private String responseMessage;
    private String responseCode;
}

// JSON DATA
{
    responseMessage: 'success',
    responseCode: '200',
    message: 'success'
}

// ERROR
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 
Unrecognized field "message" (class com.example.ResponseVo), 
not marked as ignorable

 

  • Jackson은 JSON의 모든 필드를 자바 객체로 매핑하려 시도한다.
  • 클래스에 정의되지 않은 필드가 JSON에 존재하면 이를 어떻게 처리할지 몰라 예외를 던진다.


해결방법

방법 1

 

@JsonIgnoreProperties 어노테이션 사용

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class ResponseVo {
    private String responseMessage;
    private String responseCode;
}

 

방법 2

ObjectMapper 설정 변경

Spring Boot의 Jackson ObjectMapper를 전역적으로 설정하여, 모든 JSON 매핑 작업에서 알 수 없는 필드를 무시하도록 구성한다.

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() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        return objectMapper;
    }
}

 

  • 효과: 프로젝트 전반에서 알 수 없는 필드로 인한 예외를 방지한다.
  • 장점: 여러 클래스에서 동일한 설정을 적용해야 할 때 유용하다.
  • 주의: 무조건 무시하면 의도치 않은 데이터 손실 가능성이 있다.

 

방법 3

DTO(Data Transfer Object) 사용

@Data
public class ResponseDto {
	private String responseMessage;
    private String responseCode;
    private String message;
}

 

  • 효과: 데이터의 구조를 명확히 정의할 수 있다.
  • 장점: 보안 및 유지보수성 측면에서 안전한 방식이다.
  • 적용 범위: 특정 데이터의 직렬화/역직렬화 과정에만 적용된다.

 



방법 선택

 

 

  • 단순히 무시: @JsonIgnoreProperties 또는 FAIL_ON_UNKNOWN_PROPERTIES 설정 사용.
  • 데이터 구조가 복잡: DTO 또는 커스텀 Deserializer 사용.
  • 프로젝트 전반에서 일관성 유지: 전역 ObjectMapper 설정.

 

 

문의사항이나 피드백은 댓글로 남겨주세요.