티스토리 뷰

java 에서 사용되는 json 라이브러리로 jackson 과 gson 이 대표적이다. 특히 spring boot 에서 디폴트 라이브러리로 채택되어있는 jackson 을 많이 사용할 것이다. 백엔드 개발에서 kotlin 을 사용할때도 java 생태계를 대부분 그대로 이용하므로 jackson 을 주로 사용하게된다. kotlin 에 맞춰 제작된 KotlinModule 만 넣어주면 크게 문제 없이 사용할 수 있다.

 

jetbrains 에서는 기존 java 생태계 라이브러리가 아닌 자체적인 kotlin native 라이브러리를 제공하고있다. kotlinx.serialization 이 그것인데 간략하게 한번 알아보자.

 

# kotlinx.serialization

일단 kotlin serialization 은 두 가지 특징이 있다.

- kotlin serialization 은 단순 json 라이브러리가 아니다. 라이브러리 이름에서부터 느껴지듯이 kotlin 객체 직렬화를 위한 다양한 포맷을 지원하려는 노력을 하고있다. 가장 대중적으로 사용되는 포맷이 json 이다보니 이번 포스팅의 제목도 json 라이브러리라고는 했지만 json 만을 위한 것은 아니다.

 

- 단순 라이브러리가 아니다. 컴파일러 레벨에서 동작하는 컴파일러 플러그인이다. 이 때문에 serialization 을 이용할때는 gradle 에 플러그인 설정을 해줘야한다.

 

간단한 사용법을 알아보자.

plugins {
    // other plugins
    kotlin("plugin.serialization") version "1.5.0"
}

dependencies {
    // other dependencies
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.0")
}

serialization 에 대한 의존성을 추가해줘야한다. 그리고 컴파일러 플러그인이 있어야 동작하므로 플러그인도 추가해줘야한다. 당연하겠지만 플러그인이 없으면 동작하지 않는다.

fun main() {
    val person = Person("LichKing", 33)
    val json = Json.encodeToString(person)

    println(json)
}

@Serializable
class Person(
    val name: String,
    val age: Int,
)

kotlin object 를 json 으로 변환하는 작업은 위와 같이 굉장히 간단하다. 한가지 불편한 점은 @Serializable 애노테이션을 달아줘야 한다는 것이다. 해당 애노테이션이 없으면 직렬화되지 않는다. 다만 애노테이션은 붙어있지 않는다고해서 컴파일 타임에 검증할 수가 없으므로 실수로 애노테이션을 달지 않아도 컴파일 타임에 개발자에게 피드백을 주지 못하며 런타임에만 피드백을 받을 수 있다는게 상당히 불편하다. 무언가 마커가 필요했다면 마커 애노테이션보다는 마커 인터페이스가 낫지 않았을까 싶다.

 

jackson 으로 치면 어느정도 @JsonProperty 애노테이션에 대응되는(완전 대응은 아님) @SerialName 애노테이션도 있으니 사용하면 되지만 아직 jackson 만큼의 다양한 기능들을 제공하고 있지는 않다. 특히 가장 불편했던건 naming 전략이었는데 디폴트 naming 전략은 camel case 이다. 하지만 쉽게 다른(대표적으로 snake) 방식으로 제공하고 있지 않아 snake case 를 쓴다면 일일이 @SerialName 을 달아줘야 한다.

 

# spring 통합

spring boot 에서는 jackson 을 기본 json 직렬화 라이브러리로 사용하고 있다. 이를 kotlinx.serialization 으로 바꿀 수 있을까?

물론이다. spring 에서는 이미 KotlinSerializationJsonHttpMessageConverter 를 제공하고 있다. 때문에 큰 설정 없이 위에 소개한 의존성 추가만 해주면 된다. 다만 jackson 을 kotlinx.serialization 으로 대체하는 형태는 아니고 두 라이브러리를 모두 사용하게 된다. class path 에 kotlinx.serialization 이 존재하면 이를 우선적으로 이용하고, 여기서 실패할 경우 jackson 을 이용하게 된다. 때문에 spring 에서 kotlinx.serialization 사용시 @Serilizable 애노테이션이 없어도 문제없이 직렬화가 잘 되는걸 볼 텐데 이 경우엔 kotlinx.serialization 을 사용한게 아니라 여기선 이미 실패하고 jackson 을 이용하고 있는 것이니 착각하지 말자.

 

# 성능

성능테스트를 직접 해보진 않았고, 다른 블로그를 참고했다. jackson 과 비교했을때 유의미한 큰 격차가 있어보이진 않았다.

 

# 정리

좀 알아본 결과 아직 kotlinx.serialization 을 실무에서 사용하기엔 여러모로 미흡한 부분들이 있는걸 알 수 있었다. 특히 @Serializable 애노테이션을 꼭 달아야하는게 큰 거부감이었다. 더 정확히 표현하면 달아야한다는 사실보다 실수로 달지 않았을때 피드백을 받을 수 없다는게 거부감의 원천이었다. 하지만 jetbrains 에서 직접 제공하고있는 라이브러리다보니 기울어진 운동장을 토대로 많은 이점들이 앞으로 제공되지 않을까 싶다.

 

# 참고자료

https://www.ericthecoder.com/2020/11/23/benchmarking-kotlin-json-parsers-jackson-kotlin-and-kotlinx-serialization/

https://blog.jetbrains.com/ko/kotlin/2021/05/kotlinx-serialization-1-2-released/

https://docs.spring.io/spring-framework/docs/current/reference/html/languages.html#kotlin-multiplatform-serialization

https://kotlinlang.org/docs/serialization.html

댓글
댓글쓰기 폼