#1 ๋ฌธ์ ์
#1-1 ๋ฆฌํฉํ ๋งํ ๊ธฐ์กด ์ฝ๋
package com.example.nutri_capture_new.db
import androidx.room.ColumnInfo
data class NutritionInfo(
// ๊ณผ์ ์ ๋๊ฐ
@ColumnInfo(name = "overeating_excess")
var overeatingExcess: Int = 0,
// ์ ์ ๋น ์ญ์ทจ ์ ๋๊ฐ
@ColumnInfo(name = "refined_sugar_excess")
var refinedSugarExcess: Int = 0,
// ์ ์ ๊ณก๋ฌผ ์ญ์ทจ ์ ๋๊ฐ
@ColumnInfo(name = "refined_grain_excess")
var refinedGrainExcess: Int = 0,
// ๋ฐ๊ฐ๋ฃจ ์ญ์ทจ ์ ๋๊ฐ
@ColumnInfo(name = "flour_excess")
var flourExcess: Int = 0,
// ์ฌ์ ์ง ์ญ์ทจ ์ ๋๊ฐ
@ColumnInfo(name = "fiber_quality")
var fiberQuality: Int = 0,
// ๋จ๋ฐฑ์ง ์ญ์ทจ ์ ๋๊ฐ
@ColumnInfo(name = "protein_quality")
var proteinQuality: Int = 0,
// ๋ํธ๋ฅจ ์ญ์ทจ ์ ๋๊ฐ
@ColumnInfo(name = "sodium_excess")
var sodiumExcess: Int = 0
)
#1-2 Column์ ์ด๋ฆ์ ํ๋ก๊ทธ๋๋ฐ ๋ก์ง์ด ๋ค์ด๊ฐ
๊ธฐ์กด ์ฝ๋์๋ ์ปฌ๋ผ ์ด๋ฆ์ excess๊ฐ ๋ถ์ผ๋ฉด, '์ผ๋ฐ์ ์ผ๋ก ๋ง์ด ๋จน์์๋ก ๋์ ๊ฒ', ์ปฌ๋ผ ์ด๋ฆ์ quality๊ฐ ๋ถ์ผ๋ฉด, '์ผ๋ฐ์ ์ผ๋ก ๋ง์ผ ๋จน์์๋ก ์ข์ ๊ฒ'์ด๋ผ๋ ๊ท์น์ด ์์๋ค. ์ด ์ฝ๋๋ ๋ถ๋ช ๊ฐ์ธ ํ๋ก์ ํธ์ ์ฝ๋๋ค. ๋ฐ๋ผ์ ๋๋ง ์์๋ณด๋ฉด ๋๊ธด ํ๋ค. ๊ทธ๋ฌ๋, ํญ์ '๋จ๋ค์ด ๋ดค์ ๋ ์ง๊ด์ ์ธ' ์ฝ๋๋ฅผ ์งํฅํด์ผ ํ๋ค. ๋ถ๋ช ์ธ์ ๊ฐ ํ์ฌ์ ๋ค์ด๊ฐ ํ ํ๋ก์ ํธ๋ฅผ ํ๊ฒ ๋ ํ ๋๊น. ๋, ์ฌ์ ์ด ์๊ฒจ ๊ฐ๋ฐ์ ์ค๋ ๊ธฐ๊ฐ ์์ ๋ผ๊ณ ๋ค์ ๊ฐ๋ฐํ๋ ค๋ ๊ฒฝ์ฐ ๊ณค๋ํ ์๋ ์๋ค. ์ด์จ๊ฑฐ๋, ์ด ๊ท์น์ ํ๊ธฐํ๋ค.
#1-3 ์์์๋ฅผ ์ํํ๊ธฐ ๋ถํธํจ
๋ช ์์ด ๋ฐ์ดํฐ ํด๋์ค์ธ๋ฐ, getter๋ setter๊ฐ ์๋ค. NutritionInfo ํด๋์ค๋ ์ค๋ก์ง Room์ ํ ์ด๋ธ ์คํค๋ง๋ฅผ ์ ๋ฌํ๋ ์ฉ๋๋ก๋ง ์ฐ์ด๊ณ ์๋ค. ์ฆ, ๋๋ฌด๋ ์ ์งํ๊ณ ์๋ฐ(?)ํ๋ค. ๋ค๋ฅธ ์ฝ๋์์ NutritionInfo๋ฅผ ์ฐธ์กฐํ์ฌ ๊ฐ ์์์๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ๋ ๋ฐ๋์ ๋ฐ์ํ ์ ๋ฐ์ ์๋ค. ๊ทธ๋ฌ๋ ๊ธฐ์กด ์ฝ๋์๋ ๊ด๋ จ๋ ์ฝ๋๊ฐ ์๋ค.
#2 ์ฝ๋ ์ค๋ํซ
#2-1 NutritionDetail ํด๋์ค ์ถ๊ฐ
package com.example.nutri_capture_new.db
import androidx.room.ColumnInfo
import androidx.room.Ignore
import com.example.nutri_capture_new.R
data class NutritionDetail(
@Ignore
val name: String = "๊ธฐ๋ณธ ์ด๋ฆ",
@ColumnInfo(name = "value")
var value: Int = 0,
@Ignore
val iconId: Int = R.drawable.default_nutrition,
@Ignore
val nutritionCategory: NutritionCategory = NutritionCategory.MODERATE
)
#1-1์ ๊ฐ ํ๋กํผํฐ๋ฅผ NutritionDetail์ด๋ผ๋ ์ด๋ฆ์ ํด๋์ค๋ก ๊ฐ์ ๊ฒ์ด๋ค. name์ ๋ง ๊ทธ๋๋ก ์์์์ ์ด๋ฆ, value๋ ์ญ์ทจ ์ ๋๊ฐ, iconId๋ ์์์๋ฅผ ๋ํํ๋ ์์ด์ฝ ๋ฒกํฐ ์ด๋ฏธ์ง์ ๋ฆฌ์์ค ID, nutritionCategory๋ ์์์์ ๋ฒ์ฃผ๋ค. NutritionCategory๋ enum class๋ก ์๋์ ๊ฐ๋ค.
package com.example.nutri_capture_new.db
enum class NutritionCategory {
GOOD, // ๋ง์ด ๋จน์์๋ก ์ข์ ์์์
BAD, // ๋ง์ด ๋จน์์๋ก ๋์ ์์์
MODERATE // ์ ๋นํ ๋จน์ด์ผ ์ข์ ์์์
}
NutritionCategory๋ #1-2์์ ๋งํ ๊ท์น์ ๋์ ํ๋ค.
#2-2 ๋ฆฌํฉํ ๋งํ ์ฝ๋
...
data class NutritionInfo(
// ๊ณผ์ ์ ๋๊ฐ
@Embedded(prefix = "overeating_")
val overeating: NutritionDetail = NutritionDetail(
name = "๊ณผ์ํ ์ ๋",
value = 0,
iconId = R.drawable.overeating,
nutritionCategory = NutritionCategory.BAD
),
// ์ ์ ๋น ์ญ์ทจ ์ ๋๊ฐ
@Embedded(prefix = "refined_sugar_")
val refinedSugar: NutritionDetail = NutritionDetail(
name = "์ ์ ๋น",
value = 0,
iconId = R.drawable.refined_sugar,
nutritionCategory = NutritionCategory.BAD
),
// ์ ์ ๊ณก๋ฌผ ์ญ์ทจ ์ ๋๊ฐ
@Embedded(prefix = "refined_grain_")
val refinedGrain: NutritionDetail = NutritionDetail(
name = "์ ์ ๊ณก๋ฌผ",
value = 0,
iconId = R.drawable.refined_grain,
nutritionCategory = NutritionCategory.BAD
),
// ๋ฐ๊ฐ๋ฃจ ์ญ์ทจ ์ ๋๊ฐ
@Embedded(prefix = "flour_")
val flour: NutritionDetail = NutritionDetail(
name = "๋ฐ๊ฐ๋ฃจ",
value = 0,
iconId = R.drawable.flour,
nutritionCategory = NutritionCategory.BAD
),
// ์ฌ์ ์ง ์ญ์ทจ ์ ๋๊ฐ
@Embedded(prefix = "fiber_")
val fiber: NutritionDetail = NutritionDetail(
name = "์์ด์ฌ์ ",
value = 0,
iconId = R.drawable.fiber,
nutritionCategory = NutritionCategory.GOOD
),
// ๋จ๋ฐฑ์ง ์ญ์ทจ ์ ๋๊ฐ
@Embedded(prefix = "protein_")
val protein: NutritionDetail = NutritionDetail(
name = "๋จ๋ฐฑ์ง",
value = 0,
iconId = R.drawable.protein,
nutritionCategory = NutritionCategory.GOOD
),
// ๋ํธ๋ฅจ ์ญ์ทจ ์ ๋๊ฐ
@Embedded(prefix = "sodium_")
val sodium: NutritionDetail = NutritionDetail(
name = "๋ํธ๋ฅจ",
value = 0,
iconId = R.drawable.sodium,
nutritionCategory = NutritionCategory.BAD
),
)
NutritionCategory๊ฐ ์์ผ๋ฏ๋ก, ์ปฌ๋ผ ์ด๋ฆ์์ "excess" ๋๋ "quality"๋ฅผ ์ ๊ฑฐํ๋ค. @Embedded ์ด๋ ธํ ์ด์ ์ prefix ํ๋กํผํฐ๋ ์ปฌ๋ผ ์ด๋ฆ์ด ์๋๋ค. ์ด๋ ธํ ์ด์ ๊ตฌ์กฐ ์์ ์์ ์ค @ColumnInfo ์ด๋ ธํ ์ด์ ์ด ์กด์ฌํ๋ฉด, ๊ทธ @ColumnInfo ์ด๋ ธํ ์ด์ ์ name ํ๋กํผํฐ ์์ ๋ถ๋ ์ ๋์ฌ๊ฐ ๋ฐ๋ก prefix๋ค.
๊ฐ๋ น, NutritionInfo.sodium.value๋ "sodium_value"๋ผ๋ ์ปฌ๋ผ์ ์ ์ฅ๋๋ค. NutritionInfo.sodium.value์ ๋ถ์ ์ด๋ ธํ ์ด์ ์ด @ColumnInfo(name = "value")๊ฐ ์๋๋ผ @ColumnInfo(name = "sample")์ด์๋ค๋ฉด "sodium_sample"์ด๋ผ๋ ์ด๋ฆ์ ์ปฌ๋ผ์ ์ ์ฅ๋์์ ๊ฒ์ด๋ค.
#2-3 getter ๋ฐ setter
...
data class NutritionInfo(
...
) {
fun toMutableMap(): MutableMap<String, NutritionDetail> {
return mutableMapOf(
"overeating" to overeating,
"refinedSugar" to refinedSugar,
"refinedGrain" to refinedGrain,
"flour" to flour,
"fiber" to fiber,
"protein" to protein,
"sodium" to sodium
)
}
fun updateNutritionDetail(nutritionKey: String, update: (Int) -> Int): NutritionInfo {
val updatedMap = this.toMutableMap().apply {
get(nutritionKey)?.let { detail ->
this[nutritionKey] = detail.copy(value = update(detail.value))
}
}
return NutritionInfo(
overeating = updatedMap["overeating"] ?: this.overeating,
refinedSugar = updatedMap["refinedSugar"] ?: this.refinedSugar,
refinedGrain = updatedMap["refinedGrain"] ?: this.refinedGrain,
flour = updatedMap["flour"] ?: this.flour,
fiber = updatedMap["fiber"] ?: this.fiber,
protein = updatedMap["protein"] ?: this.protein,
sodium = updatedMap["sodium"] ?: this.sodium
)
}
}
getter๋ ๋ชจ๋ ์์์์ ์ํ๋ฅผ ์ํจ์ด๋ค. setter๋ ๋ณด๊ธฐ์ ์ฝ๊ฐ ์ง์ ๋ถํ์ง๋ง, ์ฌ๊ธฐ์์ ์ฌ์ฉํ๊ธฐ ์ํด์ ์์ ๊ฐ์ด ์งฐ๋ค. ๋ด๊ฐ ๋ด๋ ๊น๋ํ ์ฝ๋๋ ์๋๊ธฐ์, ์ธ์ ๊ฐ ๋ค์ ๋ฆฌํฉํ ๋งํ๊ฒ ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ์ง๊ธ์ ๊ทธ์ ๋ ์ค๋ฅด๋ ์ต์ ์ ๋ฐฉ์์ ์ถฉ์คํ๋ค.
#4 ์์ฑ๋ ์ฑ
#4-1 ์ด ๊ฒ์๊ธ ์์ ์ Commit
GitHub - Kanmanemone/nutri-capture-new
Contribute to Kanmanemone/nutri-capture-new development by creating an account on GitHub.
github.com
#4-2 ๋ณธ ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ต์ Commit
GitHub - Kanmanemone/nutri-capture-new
Contribute to Kanmanemone/nutri-capture-new development by creating an account on GitHub.
github.com
'๊ฐ๋ฐ ์ผ์ง ๐ป > Nutri Capture' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Nutri Capture ํ๋ก ํธ์๋ - NutrientBottomSheet ๋ถ๋ถ ๊ตฌํ (0) | 2025.03.26 |
---|---|
Nutri Capture ํ๋ก ํธ์๋ - 'ํผ์' ์์ด์ฝ ์์ ์ ์ฉ (0) | 2025.03.25 |
Nutri Capture ํ๋ก ํธ์๋ - 'ํผ์' ์์ด์ฝ ๊ตฌํ (0) | 2025.03.20 |
Nutri Capture ํ๋ก ํธ์๋ - ์ปค์คํ BottomSheetScaffold ๊ฐ๋ฐ ์ ์ (0) | 2025.03.19 |
Nutri Capture ๋ฐฑ์๋ - Hilt ๋์ (0) | 2025.02.01 |