지난 주, 팀에 새롭게 합류하신 계약직 개발자 분의 첫 코드 리뷰를 진행했다.
@JsonIgnoreProperties(ignoreUnknown=true) 라는 처음 보는 어노테이션을 발견했는데,
어떤 역할을 하는 녀석인지, 꼭 필요한 기능인지 등 팀원들과 논의했던 결과를 기록한다.
@JsonIgnoreProperties(ignoreUnknown=true) ?
공식 문서에서 어떤 역할을 하는지 쉽게 예를 들어 설명해주고 있다.
읽어보면 이름을 정말 직관적으로 잘 지었다는 생각이 든다.
Annotation that can be used to either suppress serialization of properties (during serialization), or ignore processing of JSON properties read (during deserialization).
Example:
// to prevent specified fields from being serialized or deserialized
// (i.e. not include in JSON output; or being set even if they were included)
@JsonIgnoreProperties({ "internalId", "secretKey" })
// To ignore any unknown properties in JSON input without exception:
@JsonIgnoreProperties(ignoreUnknown=true)
Annotation can be applied both to classes and to properties.
If used for both, actual set will be union of all ignorals: that is, you can only add properties to ignore, not remove or override. So you can not remove properties to ignore using per-property annotation.
이 어노테이션의 역할은 역직렬화(deserialization) 과정에서,
즉, JSON 데이터를 읽어 객체에 매핑해주는 과정에서 객체에 없는 알 수 없는 property가 JSON 데이터에 있어도 에러를 내뱉지 않고 무시해준다는 것이다.
예시
쇼핑몰의 특정 상품의 가격을 바꾸는 API를 통해 이 어노테이션을 사용하는 예를 러프하게 하나 들어보자.
(1) 클라이언트 측에서는 해당 API의 Request Body에 아래와 같은 JSON 형태의 데이터를 담아 서버에 요청한다.
{
"price": 24000
}
(2) 서버에서는 요청 정보를 아래와 같은 PriceChangeRequest라는 객체로 받는다.
public class PriceChangeRequest {
private final int price;
}
근데 만약, 클라이언트 측에서 아래처럼 서버에는 없는 key-value를 추가한다면?
{
"price": 24000,
"unknown_property": "yeahyeah"
}
이러한 케이스를 대비하는 설정이 프로젝트에 적용되어 있지 않다면 에러가 발생할 것이다.
이때 @JsonIgnoreProperties(ignoreUnknown= rue)을 아래처럼 PriceChangeRequest 클래스에 붙여주게 되면,
에러가 발생하지 않고 스무스하게 넘어간다.
@JsonIgnoreProperties(ignoreUnknown = true)
public class PriceChangeRequest {
private final int price;
}
꼭 필요한가..?
이 어노테이션이 어떤 역할을 하는지 찾아보고 난 뒤 의문이 들었다.
평소 API 개발하고 테스트할 때, 위에서 언급한 예시와 같은 상황이 가끔 있었는데 에러가 발생하지 않았기 때문이다.
좀 더 찾아보니, yml 파일에 아래와 같은 설정을 추가하면 @JsonIgnoreProperties 어노테이션을 따로 붙여주지 않아도 동일한 기능이 프로젝트 전체에 적용된다고 하는데, 이런 설정도 되어있지 않았다.
deserialization: fail-on-unknown-properties: false
좀 더 찾아보고 있던 중에 팀원 분께서 아래와 같은 링크와 함께 의문을 해결해주셨다.
https://www.baeldung.com/spring-boot-customize-jackson-objectmapper
이 글의 2. Default Configuration 파트를 보면 아래와 같은 문장들이 나온다.
By default, the Spring Boot configuration will disable the following:
MapperFeature.DEFAULT_VIEW_INCLUSION
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
SerializationFeature.WRITE_DATES_AS_TIMESTAMPS
중간에 볼드체로 표시해둔 부분!!
이미 최초 Spring Boot 환경설정에서 알 수 없는 property에 대해 에러가 발생하는 것을 disable 시켜버렸기 때문이다.
결론
1. Spring Boot 최초 환경설정에서 JSON 데이터에 알 수 없는 property가 있어도 무시하는 설정이 되어 있다.
2. 이 설정을 임의로 변경하지 않는 이상 @JsonIgnoreProperties(ignoreUnknown = true)는 필요없다.
'Study > Java' 카테고리의 다른 글
[Java] Method Naming Convention (feat. of vs from) (0) | 2022.09.04 |
---|---|
[Java] removeIf 사용법 (0) | 2022.04.01 |
[Java] Java의 Garbage Collection - Generational GC, G1 GC (3) | 2021.05.10 |
[Java] HashMap, HashSet 이란? - (5) HashMap과 HashSet의 차이 (4) | 2021.04.01 |
[Java] HashMap, HashSet 이란? - (4) HashSet이란? (0) | 2021.03.31 |