Spring

Jackson에서 Boolean 직렬화 시 is가 사라지는 문제

반응형
Swagger에서 JSON Request Body를 보는데 DTO랑 이름이 달라요!

발단

여느때와 다름없이 조용히 회사에서 개발을 하고 있는 도중, Swagger로 API 테스트를 위해 요청을 보내는데 debug에서 객체를 보았을 때, 특정 변수만 null로 들어오는 상황이 발생했습니다.
처음에는 JSON key가 잘못됐나 싶어서 다시 작성해보지만 마찬가지였습니다.

JSON Body를 다시 한번 봐 보니 Boolean으로 선언한 'isUsing'이라는 변수가 직렬화 시 Swagger 내에서 제가 예상한 isUsing이라는 key와 달리 using으로 표시되는 것이였습니다.
일단 평소와 같이 @JsonProperty 어노테이션을 사용하여 JSON key를 임의로 지정을 했고, Swagger에서는 isUsing으로 잘 표기가 되었습니다. 하지만 debug에서는 여전히 null로 값을 가져오고 있었습니다.

Stackoverflow를 찾아보니 저와 같은 문제가 발생한 분이 계셨습니다.

 

Jackson renames primitive boolean field by removing 'is'

This might be a duplicate. But I cannot find a solution to my Problem. I have a class public class MyResponse implements Serializable { private boolean isSuccess; public boolean isSuccess...

stackoverflow.com

해결

Jackson에서는 직렬화 시 get/set prefix를 제외 (Boolean에서는 is) 하므로 변수명에 해당 prefix를 추가해서 사용하고 싶다면 직접 설정해주어야 합니다.
Kotlin에서 아래와 같은 방법으로 간단히 해결할 수 있습니다.

data class TestDTO(
    @get:JsonProperty("isUsing")
    @param:JsonProperty("isUsing")
    var isUsing: Boolean? = true,

    var name: String? = null,
)


사용하고자 하는 변수명에 @get:JsonProperty, @param:JsonProperty를 지정하여 직렬화 키워드 누락 문제를 해결할 수 있습니다.

 

JavaBeans Convention과 Jackson의 직렬화 동작간의 충돌로 발생 하는 것으로 보이며, is를 빼고 다른 키워드를 넣는게 더 깔끔할 수 있습니다.

 

반응형

'Spring' 카테고리의 다른 글

[JPA] ORM #1  (0) 2023.02.19
자바 클래스 이름에 Impl을 사용하지 말아야 하는 이유  (7) 2021.02.07