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 설정.
문의사항이나 피드백은 댓글로 남겨주세요.
'프로그래밍 언어 > JAVA, SPRING' 카테고리의 다른 글
[SPRING BOOT] WebSocket과 Redis를 활용한 실시간 채팅 시스템 구축하기 (0) | 2024.11.26 |
---|---|
[SPRING BOOT] CORS 에러와 DELETE요청 해결하기 (0) | 2024.11.26 |
[JAVA] Exception Handling (0) | 2024.07.22 |
[SPRING] Sleuth (0) | 2024.07.22 |
[SPRING] Hystrix (0) | 2024.07.22 |