티스토리 뷰
이번 포스팅 내용은 kotlin 과 jackson 조합시에만 발생하므로 java 이용시엔 해당하지않는다. 정확히말하면 jackson 에서 kotlin 지원을 위한 모듈인 jackson-module-kotlin 의 문제다.
jackson-module-kotlin 2.10.0 까지는 data class 를 json 으로 serialize 시 is 로 시작하는 프로퍼티에 대해 is 를 제거한 key 로 serialize 했다. 쉽게 코드를 보고 얘기하자면
data class Person(
val isDeveloper: Boolean
)
이 클래스를 serialize 시 json 형태는 이런 형태였다.
{"developer":true}
jackson-kotlin-module 2.10.1 부터는 이 스펙이 변경되어 isXXX 프로퍼티에대해 is 를 포함하게된다.
{"isDeveloper":true}
서버개발에서 kotlin 을 사용시 spring boot 를 조합해서 사용하는 경우가 많을거고, spring boot 는 json 라이브러리로 jackson 을 이용하기때문에 이번 변경이 생각보다 치명적일 수 있다. api 응답 DTO 에 isXXX 프로퍼티가 존재한다면 spring boot 버전을 올리는것 만으로 api 스펙이 변경될 여지가 있기때문이다.
jackson 에서 관련이슈는 https://github.com/FasterXML/jackson-module-kotlin/issues/80 를 통해 살펴볼 수 있다. 사실 serialize/deserialize 간에 이슈가 있었고, 자바에서는 is 가 포함돼서 serialize 되고있었기때문에 스펙변경이라기보다는 버그픽스라고 보는게 맞을것 같다. 하지만 기존 스펙(버그)에 기대어 작성된 api 가 있다면 어쩔수없이 해당 부분까지 안고가야한다. 버전을 올리면서 기존 api 스펙을 유지하기위해서는(isXXX 에서 serialize 시 기존대로 is 를 제거하려면) 현재 상태로는 @JsonProperty 를 사용해 명시적으로 key 를 작성해주는 방법밖에 없어보인다.
data class Person(
@JsonProperty("developer")
val isDeveloper: Boolean
)
기존 테스트코드가 빈약한 프로젝트에서 spring boot 버전업을 하기전에 몇가지 테스트 코드를 작성해놓고 버전업을 한다음에 앞서 작성한 테스트코드가 정상적으로 돌지않아 이번 문제를 확인 할 수 있었다. 만약 테스트코드가 없는상태에서 버전업을 했다면 별문제없이 컴파일되는거보고 배포했다가 실서비스에서 장애로 발전할뻔했다. 역시 테스트 코드는 열심히 작성해야한다.
'kotlin' 카테고리의 다른 글
kotlin 1.4 (0) | 2020.10.01 |
---|---|
kotlin(+JPA) entity 에서 setter 를 막을 수 있을까 (4) | 2020.09.18 |
kotlin에서의 generics (2) | 2019.11.13 |
코틀린의 collection, sequence, stream (0) | 2019.10.27 |
코틀린의 지역변수는 스레드 세이프한가? (2) | 2019.10.27 |
- Total
- Today
- Yesterday
- Jackson
- OOP
- http
- EffectiveJava
- spring cloud
- DesignPattern
- java
- clean code
- JavaScript Core
- generics
- Kotlin
- frontend개발환경
- backend개발환경
- mariadb
- MySQL
- db
- toby
- code
- programming
- servlet
- frontcode
- JPA
- go-core
- javascript
- java8
- Spring
- 정규표현식
- Design Pattern
- TEST
- Git
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |