본문 바로가기
Spring

[Spring + Kotlin] Jackson 역직렬화할 때 프로퍼티명 2번째 대문자가 소문자로 변하는 문제 해결 방법

by 노력남자 2024. 11. 7.
반응형

문제

 

data class GetUserResponse(
    val uName: String
)

 

위는 유저 조회 api 응답 class다.

 

{
	"uName": "노력남자"
}

 

api 응답은 당연하게 위와 같이 uName으로 나올 거라고 생각했는데..

 

{
	"uname": "노력남자"
}

 

uname으로 나오는 게 아니겠는가?

 

원인

 

코틀린 코드는 자바와 호환하기 컴파일할 때 val, var을 getter 메소드로 만드는데 get + 변수명 (첫글자를 대문자로 변경) 으로 만들어서 생긴 문제다.

 

GetUserResponse 코틀린 클래스를 자바 코드로 변환하면 아래와 같다.

 

public final class GetUserResponse {
    ...
    
    @NotNull
    public final String getUName() {
        return this.uName;
    }
}

 

내가 사용한 변수명은 uName인데 getter로 바뀌면서 getUName으로 바뀌었다.

 

근데 이게 왜 문제냐?

 

Jackson은 getter 메소드명을 이용해서 역직렬화를 한다. 방법은 아래와 같다.

 

1. get을 제거: UName

2. 첫 소문자가 나올때까지 문자를 탐색 후 대문자를 소문자로 변환: uname

3. 그 다음부터는 네이밍 전략을 따름

 

2번 로직 때문에 uName이 아니라 uname으로 역직렬화된 것이다.

 

해결책

 

해당 문제는 jackson-module-kotlin 2.16이하 버전에서 발생하는 문제다.

 

해결 방법은 2가지다.

 

1. jackson-module-kotlin 버전으로 2.16 이상으로 올린다.

2. @get:JsonProperty를 붙여준다. 예) @get:JsonProperty("uName")

 

참고

 

- https://github.com/FasterXML/jackson-module-kotlin/issues/630

반응형

댓글