성장기록지
Jetpack Room의 TypeConverter 적용하기 본문
Room TypeConverter란?
- 안드로이드 로컬 데이터베이스인 Room 같은 경우 컬럼에 List나 Data class를 사용하려 하면 에러가 발생하게 된다.
- 기본적으로 Room은 원시타입(int, short, long ....)과 wrapping 타입만 지원함.
- 이때 Type Converter를 적용하면 에러를 발생시키지 않고 정보를 담을 수 있다.
객체 참조를 허용하지 않는 이유
- 서버에서는 데이터베이스의 관계를 객체 모델로 매핑하고 지연 로딩(lazy loading)을 사용해도 괜찮다.
- 하지만 안드로이드 앱의 UI 스레드에서는 이런 방식이 문제가 된다.
(지연 로딩이란? -> 필요한 순간까지 데이터 로딩을 미루는 방식으로 데이터베이스에서 데이터를 불러올 때 사용하는 전략)
- UI 스레드는 화면을 그리는데 약 16ms가 걸린다.
- 데이터베이스 쿼리가 5ms만 걸려도 프레임을 그리는 시간이 부족해져 화면이 버벅거릴 수 있다.
때문에 개발자가 직접 TypeConverters를 구현해주어 Room database에 data class를 사용할 수 있게 해주어야 한다.
Type Converter 적용
아래와 같은 ShoppingItem이라는 Entity를 구성하려고 한다.
Item이라는 data class를 컨버터를 통해 처리해줘야 한다.
@Entity(tableName = "bookmark_items")
data class ShoppingItem(
@PrimaryKey val id: String,
val item: Item,
val isBookmarked: Boolean
) {
companion object {
fun placeholder(): ShoppingItem {
return ShoppingItem(
id = "",
item = Item.placeholder(),
isBookmarked = false
)
}
}
}
ShoppingItemTypeConverter를 구성해준다.
Gson을 이용해 Json과 Item간의 직렬화, 역직렬화를 처리해준다.
(물론 Gson을 dependency에 추가해줘야 한다.)
package com.example.ishopping.util.converters
import androidx.room.TypeConverter
import com.example.ishopping.data.model.Item
import com.google.gson.Gson
class ShoppingItemTypeConverter {
@TypeConverter
fun itemToJson(value: Item): String? {
return Gson().toJson(value)
}
@TypeConverter
fun jsonToItem(value: String): Item {
return Gson().fromJson(value, Item::class.java)
}
}
이후 RoomDatabase에서 @TypeConverters를 통해 지정해주면 아주 쉽게 완료된다.
@Database(entities = [ShoppingItem::class], version = 2)
@TypeConverters(ShoppingItemTypeConverter::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun bookmarkItemDao(): ShoppingItemDao
}
'개인 프로젝트' 카테고리의 다른 글
Room을 활용한 쇼핑 상품 북마크 기능 (기능 구현 과정) (0) | 2025.02.09 |
---|---|
Room을 활용한 쇼핑 상품 북마크 기능(Room 구조 구현) (0) | 2025.02.08 |
Flow debounce와 프로젝트 적용(검색 기능 api 호출 최적화) (1) | 2025.02.01 |
Paging 학습 및 프로젝트 적용 (1) | 2025.01.28 |
네트워크 통신 라이브러리 사용 고찰 (HttpUrlConnection, OkHttp, retrofit) (0) | 2025.01.15 |