| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- apollo3
- snapshotflow
- 2022 kakao blind
- 2989번
- mutablestate
- compose
- genarics
- clean coder
- producestate
- 명령형 ui
- bottomscaffold
- State
- remembercoroutinescope
- gradle jdk
- Java
- 선언형ui
- 명령형ui
- 무선 페어링
- mutableStateOf
- ktor-auth
- 양과 늑대
- derivedstateof
- rememberupdatedstate
- 자바
- NavHost
- JCF
- 2022 KAKAO BLIND RECRUITMENT
- android
- 안드로이드
- 선언형 ui
- Today
- Total
버미
[안드로이드] Gson과 kotlinx.serialization 차이 본문
안드로이드에서 Retrofit을 주입할 때, ConverterFactory로 Gson을 사용할지 kotlinx.serialization 중에 어떤걸 사용할지 고민한 경험이 있다. 이 둘은 어떤 목적에 따라 사용하는지 정리해보자.
네트워크 통신을 수행하기 위해서는 서버와 데이터를 주고받아야 하며, 안드로이드에서는 일반적으로 Retrofit을 사용한다.
이때 응용 계층에서는 주로 JSON이나 XML과 같은 데이터 형식을 통해 정보를 교환한다.
하지만 Java나 Kotlin은 객체 지향 언어이기 때문에, 네트워크로 전달받은 데이터를 객체 형태로 변환하여 관리해야 한다.
따라서 이러한 데이터 직렬화 과정을 수행할 때, Gson 또는 kotlinx.serialization과 같은 라이브러리를 사용하게 되며, 두 라이브러리의 차이는 바로 객체와 JSON 간 변환을 수행하는 방식에 있다.
kotlinx.serialization
kotlinx.serialization은 Kotlin 언어 공식 직렬화(Serialization) 라이브러리다.
Kotlin 객체를 JSON, ProtoBuf, CBOR 등 다양한 데이터 형식으로 변환하거나 반대로 역직렬화(Deserialization) 하기 위해 사용한다. JetBrains 이 직접 개발 및 유지보수하며, Kotlin 컴파일러와 함께 사용하는 컴파일 시점에 변환 코드를 자동 생성하는 것이 가장 큰 특징이다.
주요 특징 정리
1. Kotlin 공식 지원
- JetBrains에서 개발한 Kotlin 전용 라이브러리.
- Kotlin 컴파일러와 통합되어 있기 때문에, Kotlin 코드 스타일 및 기능(예: data class, sealed class 등)과 자연스럽게 연동.
2. 컴파일 타임 코드 생성
- @Serializable 어노테이션이 붙은 클래스에 대해, Kotlin 컴파일러가 JSON 변환 로직을 자동으로 생성.
- 런타임에 리플렉션(reflection)을 사용하지 않으므로 속도가 빠르고, 메모리 사용량이 적다.
@Serializable
data class User(val name: String, val platForm: String)
// 직렬화 (encode)
Json.encodeToString(User("Bum2", "Tistory"))
// → {"name":"Bum2","platForm":"Tistory"}
// 역직렬화 (decode)
Json.decodeFromString<User>("""{"name":"Bum2","platForm":"Tistory"}""")
// → User(name="Bum2", platForm="Tistory")
3. 플러그인 설정 필요
- 코드를 자동 생성하기 위해선 org.jetbrains.kotlin.plugin.serialization 플러그인을 Gradle에 등록해야 한다.
// Data Module Gradle
plugins { id("org.jetbrains.kotlin.plugin.serialization") }
4. 타입 안정성과 Null 안전성 보장
- 컴파일 시점에 직렬화 가능한 필드와 타입을 검사하여, 런타임 오류를 최소화.
- ignoreUnknownKeys, explicitNulls 등의 설정으로 서버 응답에도 유연하게 대응.
val json = Json {
ignoreUnknownKeys = true // 서버에서 불필요한 키가 와도 무시
explicitNulls = false // null 필드는 생략
}
5. Kotlin Multiplatform 지원
- JVM(Android)뿐만 아니라 JS, iOS, Native 등 Kotlin Multiplatform 프로젝트에서도 사용 가능.
- Gson이나 Moshi보다 확장성이 뛰어남.
6. Retrofit과의 연동
- Retrofit에서 ConverterFactory로 연동 가능:
@Provides
@Singleton
@Bum2
fun provideSeraRetrofit(
okHttpClient: OkHttpClient,
json: Json,
@Bum2 baseUrl: String,
): Retrofit {
return Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(
json.asConverterFactory((requireNotNull("application/json".toMediaTypeOrNull()))),
)
.build()
}
7. 다양한 데이터 포맷 지원
- 단순 JSON뿐만 아니라, CBOR, ProtoBuf, Properties 등 다양한 포맷으로 직렬화 가능.
| 항목 | 설명 |
| 이름 | kotlinx.serialization |
| 만든 곳 | JetBrains (Kotlin 공식) |
| 용도 | Kotlin 객체 ↔ JSON/CBOR/ProtoBuf 등 데이터 형식 변환 |
| 작동 시점 | 컴파일 타임 (Code Generation) |
| 핵심 특징 | 빠름, 타입 안전, 리플렉션 없음, 멀티플랫폼 지원 |
| Retrofit 연동법 | .addConverterFactory(json.asConverterFactory(...)) |
| 플러그인 필요 여부 | org.jetbrains.kotlin.plugin.serialization 등록 필수 |
Gson
Gson은 Google에서 개발한 JSON 직렬화(Serialization) 및 역직렬화(Deserialization) 라이브러리다.
Retrofit이나 OkHttp 같은 네트워크 라이브러리와 함께 사용되어 서버에서 주고받는 JSON 데이터를 자동으로 객체 형태로 처리할 수 있게 해준다.
주요 특징 정리
1. Google에서 개발한 JSON 파서
- “Google JSON”의 약자로, Google이 직접 개발한 라이브러리.
2. 리플렉션(Reflection) 기반의 런타임 변환
- Gson은 앱이 실행 중일 때(런타임) 클래스의 필드 정보를 읽어(JSON 키와 매칭) 객체를 생성.
- 컴파일 시점에 코드를 생성하지 않고, 런타임에 리플렉션을 사용하기 때문에 설정이 단순하고 빠르게 적용가능.
하지만 런타임 오버헤드(성능 비용)는 약간 존재.
- 별도의 플러그인 설정 없이 한 줄 의존성으로 바로 사용 가능.
// Data Module dependencies
implementation("com.squareup.retrofit2:converter-gson:2.11.0")
@Provides
@Singleton
@Bum2
fun provideRetrofit(
okHttpClient: OkHttpClient,
@Bum2 baseUrl: String,
): Retrofit {
return Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
4. 어노테이션 기반 매핑
- JSON 키 이름과 객체 프로퍼티 이름이 다를 때는 @SerializedName 어노테이션을 사용해 매핑.
data class User(
@SerializedName("user_name") val name: String,
@SerializedName("user_age") val age: Int
)
5. 유연한 설정과 커스터마이징
- 날짜 포맷, 널 처리, pretty print, 필드 제외 등 다양한 옵션 제공
val gson = GsonBuilder()
.setPrettyPrinting()
.serializeNulls()
.create()
| 항목 | 설명 |
| 이름 | Gson (Google JSON) |
| 만든 곳 | |
| 용도 | Java/Kotlin 객체 ↔ JSON 데이터 형식 변환 |
| 작동 시점 | 런타임 (Reflection 기반) |
| 핵심 특징 | 설정이 간단, 직관적인 사용법, 런타임 리플렉션 사용, 널 처리 및 매핑 유연 |
| Retrofit 연동법 | .addConverterFactory(GsonConverterFactory.create()) |
| 플러그인 필요 여부 | 별도 플러그인 불필요 (의존성 추가만으로 사용 가능) |
결국 Gson과 kotlinx.serialization은 객체 ↔ JSON으로 변환하기 위한 도구다.
Gson은 런타임에 리플렉션을 사용해 변환을 수행한다.
별도의 설정 없이 빠르게 적용할 수 있다는 장점이 있지만, 앱이 실행 중일 때 클래스 구조를 탐색하므로 약간의 성능 오버헤드가 발생한다.
반면 kotlinx.serialization은 컴파일 시점에 변환 코드를 미리 생성한다.
Kotlin 컴파일러와 직접 통합되어 리플렉션 없이 빠르고 타입 안정적으로 작동하며, 멀티플랫폼 환경에서도 동일한 직렬화 로직을 공유할 수 있다는 강점을 지닌다.
'안드로이드' 카테고리의 다른 글
| [안드로이드] JDK, JRE, JVM 그리고 Gradle JDK (0) | 2025.10.09 |
|---|---|
| [안드로이드] 안드로이드 스튜디오 무선 연결이 안될 때 (0) | 2025.10.02 |
| [안드로이드] Gradle 이란 (0) | 2025.09.16 |
| [안드로이드] ABB와 APK (0) | 2025.08.11 |
| [안드로이드] ANR (0) | 2025.07.22 |