반응형
문제
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
반응형
'Spring' 카테고리의 다른 글
[Spring] Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '=', 'UNION' (1) | 2024.03.30 |
---|---|
[Spring] Spring Boot + Kotlin + MyBatis 프로젝트 설정 방법 (3) | 2024.03.26 |
[Spring] 재시도할 때 사용하는 @Retryable, @Recover 사용법 (1) | 2024.02.26 |
[Spring] Kotest 병렬 테스트 설정 방법 (23) | 2023.12.31 |
[Spring] Gradle Test events were not received 해결 방법 (21) | 2023.12.28 |
댓글