나만 보는 일기장

[Room] Type Converter 만들기 본문

개발/Android

[Room] Type Converter 만들기

Patrick0422 2021. 11. 3. 20:13

데이터베이스에는 복잡한 구조를 가진 커스텀 클래스를 넣기 어렵기 때문에 이를 Int, String형 같은 원시 타입으로 변환(직렬화) 해주어야 합니다. 이때 이 직렬화와 역직렬화를 수행하기 위해 만드는 게 바로 Type Converter입니다.

data class Result(
    @SerializedName("aggregateLikes")
    val aggregateLikes: Int,
    @SerializedName("cheap")
    val cheap: Boolean,
    @SerializedName("dairyFree")
    val dairyFree: Boolean,
    @SerializedName("extendedIngredients")
    val extendedIngredients: List<ExtendedIngredient>,
    @SerializedName("glutenFree")
    val glutenFree: Boolean,
    @SerializedName("id")
    val id: Int,
    @SerializedName("image")
    val image: String,
    @SerializedName("readyInMinutes")
    val readyInMinutes: Int,
    @SerializedName("sourceName")
    val sourceName: String,
    @SerializedName("sourceUrl")
    val sourceUrl: String,
    @SerializedName("summary")
    val summary: String,
    @SerializedName("title")
    val title: String,
    @SerializedName("vegan")
    val vegan: Boolean,
    @SerializedName("vegetarian")
    val vegetarian: Boolean,
    @SerializedName("veryHealthy")
    val veryHealthy: Boolean
)

▲ 이런 클래스를 데이터베이스에 그대로 넣을 수 없다.

 

class RecipesTypeConverter {
    val gson = Gson()

    @TypeConverter
    fun foodRecipeToString(foodRecipe: FoodRecipe): String = gson.toJson(foodRecipe)

    @TypeConverter
    fun stringToFoodRecipe(data: String): FoodRecipe {
        val listType = object : TypeToken<FoodRecipe>() {}.type
        return gson.fromJson(data, listType)
    }
}

보통은 Gson 라이브러리를 통해 클래스를 Json 형태의 문자열로 만들어 직렬화를 수행하는 것 같습니다.

 

직렬화/역직렬화를 수행하는 함수에는 @TypeConverter 어노테이션을 붙여줍니다.

Comments