개발지식 아카이브/JAVA
[Json] gson, Jackson 컨버터의 null 필드 처리 방법
민서_Soya
2020. 10. 31. 13:42
RestTemplate 의 기본 컨버터인 Jackson 컨버터의 null 필드를 처리하는 방법이 요즘 많이 쓰이는 gson 컨버터의 처리 방법과 다르다는 것을 발견하고 포스팅으로 남긴다.
dto: Stock(id=1, code=005560, name=JS전선, market=null)
가령 이런 데이터를 가진 dto 를 json 형식으로 변환하고 싶은 상황이다. 이 때 'market' 필드는 null 값을 가진다.
log.info("dto: {}", stock);
# converting
log.info("json by Gson converter: {}", gson.toJson(stock));
log.info("json by Jackson converter: {}", objectMapper.writeValueAsString(stock));
먼저 gson 컨버터로 변환해서 찍어보고, 그 다음 잭슨 컨버터로도 변환해서 찍어본다.
동일한 dto 를 변환했는데 결과는 다른 값이 나온다.
jackson 컨버터는 "market" 필드의 value 가 null 인것으로 처리하여 변환하는 반면, gson 컨버터는 필드값이 null 인 경우 json 파라미터로 아예 변환을 하지 않는다.
또한 Date 타입을 format 지정 없이 바로 내보낼 경우 형식이 다르다. (위의 결과 메시지 참조)
null 이 포함될 수 있는 dto 를 변환할 때 이러한 특성을 모르고 컨버터를 선택한다면 의도한 바와 다른 payload 가 나갈수 있다.
특히 RestTemplate 으로 전송시에는 내부에서 변환된 json String을 로그로 찍어주지 않기 때문에, 어떤 값이 나가는지 주의해야한다. (참고로 RestTemplate 에서 쓰이는 json 컨버터는 커스텀으로 바꿀 수 있다. default 는 jackson 컨버터지만, gson 의 컨버팅 정책이 더 적합하다면 개발자가 override 하여 변경할 수도 있다.)