(Android/안드로이드) Gson 실무 활용법 - 모델 파싱, 제네릭, 버전관리 등
05 February 2026 -
3 mins read time
Tags:
Android
Kotlin
개요
- Gson은 “그냥 toJson/fromJson”으로 끝나지 않습니다. 실무에서는 아래를 같이 챙겨야 장애가 줄어듭니다.
- 제네릭(List/Map/Wrapper) 파싱
- 서버 필드 변경(스키마 drift) 대응
- null/기본값/enum/날짜 포맷 처리
- 파싱 실패 방어(크래시 방지)
- R8/Proguard(난독화) + 리플렉션 이슈
- Intent/Bundle 전달 시 안정성(Parcelable 대체)
1. Gson을 “파서”로만 쓰지 말고 “경계(Boundary)”로 쓰기
- ✅ 실무 원칙
- 네트워크/저장소/IPC 경계에서만 JSON <-> Model 변환
- 앱 내부(core)에서는 도메인 모델로 유지
- 즉, “JSON DTO → Domain 변환”을 분리하면 서버 스키마가 흔들려도 영향 범위가 작아집니다.
2. 기본 사용: 객체 ↔ JSON
data class People(val id: Int, val name: String)
// 매번 생성하는 방식
val gson = Gson()
val json = gson.toJson(People(1, "kim"))
val obj = gson.fromJson(json, People::class.java)
// 싱글톤으로 재사용
object GsonProvider {
val gson: Gson = GsonBuilder()
.serializeNulls() // 필요할 때만
.create()
}
3. 제네릭 파싱 (TypeToken) — 실무에서 가장 자주 씀
3-1. List/Map
val type = object : TypeToken<List<People>>() {}.type
val list: List<People> = GsonProvider.gson.fromJson(json, type)
3-2. 공통 응답 Wrapper
// json : { "code": 0, "data": { "id": 1, "name": "kim" } }
data class ApiResponse<T>(
val code: Int,
val data: T?
)
val type = object : TypeToken<ApiResponse<People>>() {}.type
val res: ApiResponse<People> = GsonProvider.gson.fromJson(json, type)
4. 파싱 실패 방어: “크래시 대신 null/에러 객체”
inline fun <reified T> Gson.safeFromJson(json: String): T? =
runCatching {
fromJson(json, object : TypeToken<T>() {}.type)
}.getOrNull()
val people: People? = GsonProvider.gson.safeFromJson(json)
- 실패 시 null → UI/비즈니스 레벨에서 graceful handling 가능
5. 서버 필드 변경 대응: default 값 / Nullable 설계
data class PeopleDto(
val id: Int? = null,
val name: String? = null
)
data class People(
val id: Int,
val name: String
)
fun PeopleDto.toDomain(): People? {
val safeId = id ?: return null
val safeName = name ?: return null
return People(safeId, safeName)
}
- 서버에서 “없을 수 있는 값”은 nullable
- 앱이 꼭 필요한 값은 “DTO 단계에서 기본값” 부여 후 Domain으로 변환
6. 날짜/시간 파싱: 커스텀 포맷 고정
val gson = GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
.create()
- 서버 날짜 포맷이 yyyy-MM-dd’T’HH:mm:ss.SSSZ 같은 형태
- 날짜 포맷이 여러 개면 JsonDeserializer 커스텀으로 처리
Related Posts