Notice
Recent Posts
Recent Comments
«   2025/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

성장기록지

Jetpack Room의 TypeConverter 적용하기 본문

개인 프로젝트

Jetpack Room의 TypeConverter 적용하기

pengcon 2025. 2. 5. 01:02

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
}