#1 ๊ฐ์
#1-1 ์ฐ์ํจ
์ด์ ๊ฒ์๊ธ์์ ๋ง๋ , ๊ฐ์ ํ ์ด๋ธ์ ์ฐธ์กฐํ๋ DAO ํจ์๋ ๊ฐ์ ํ ์ด๋ธ์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ํต์งธ๋ก ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ด์๋ค. ํ์ง๋ง ์ด๋ ์ฐ์ํจ๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ์๋ ๋ฐฉ์์ด๋ค. ์ฒ์์๋ ํ๋ฉด์ ๊ฐ๋ ์ฑ์ธ ์ ๋์ ๋ ์ฝ๋๋ง ๊ฐ์ ธ์ค๊ณ , ๋ฌดํ ์คํฌ๋กค์ ํตํด์ ํ์ํ ๋งํผ๋ง ๋ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ ๊ตฌํํ ๊ฒ์ด๋ค.
"View๊ฐ ๋ณด์ ํ ๋ง์ง๋ง ๋ ์ฝ๋๊ฐ ๋ฌด์์ธ์ง ์๊ณ , ํด๋น ๋ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก (ํ ์ด๋ธ ์์น ์) ๋ ๋ค์ ์๋ ๋ ์ฝ๋๋ค์ ๋ฝ์์ค๋ฉด ๋ ๊ฒ์ด๋ค."๋ผ๊ณ ์ฒ์์๋ ๊ฐ๋จํ๊ฒ๋ง ์๊ฐํ๋ค. ๊ทธ๋ฌ๋ ์ํ์ฐฉ์ค๋ฅผ ๊ฒช์ผ๋ฉฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ธ๋ค (๊ณ ์ DAO ํจ์ํ๋ ๋ง๋๋ ๊ฑด๋ฐ ์ด์ ๊ฒ์๊ธ๊ณผ ๋ณ๋์ ๊ฒ์๊ธ๋ก ๋ถ๋ฆฌํ ์ด์ ๊ธฐ๋ ํ๋ค).
#1-2 ์ฒซ ์๋: Cursor
Room DAO๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ก์ธ์ค | Android Developers
Room ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ์ธ DAO(๋ฐ์ดํฐ ์ก์ธ์ค ๊ฐ์ฒด)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์์ ํ๋ ๋ฐฉ๋ฒ ์์๋ณด๊ธฐ
developer.android.com
์ ์ผ ์ข์ ๋ฐฉ๋ฒ์, Cursor๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค. ์๋ํ๋ฉด ์ด์ ๊ฒ์๊ธ์์ ๋ง๋ค์๋ ๊ฐ์ ํ ์ด๋ธ์ ์ด 3๊ฐ์ ์ ๋ ฌ ๊ธฐ์ค์ผ๋ก ์ด๋ฏธ ์ ๋ ฌ๋ ์ํ์ ํ ์ด๋ธ์ด๊ธฐ ๋๋ฌธ์ด์๋ค. ๊ทธ๋ฌ๋๊น, View๊ฐ ๋ณด์ ํ ๋ง์ง๋ง ๋ ์ฝ๋์ ์งํ ๋ ์ฝ๋์ Cursor๋ฅผ ๋๊ณ ํ ์นธ์ฉ ๋ด๋ ค๊ฐ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ถ์๋ ๊ฑฐ๋ค. ๋ฃ๊ธฐ์๋ ์ง๊ด์ ์ผ๋ก ๋ณด์ธ๋ค.
ํ๋ ์ ๊ณต์ ๋ฌธ์์ ๊ฒฝ๊ณ ๋ฌธ์ด ๋ง์์ ๊ฑธ๋ฆฐ๋ค. "Cursor API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค. ํ์ด ์กด์ฌํ๋์ง ๋๋ ํ์ ์ด๋ค ๊ฐ์ด ๋ค์ด ์๋์ง ๋ณด์ฅํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ปค์๋ฅผ ์์ํ๋ ์ฝ๋๊ฐ ์ด๋ฏธ ์๊ณ ์ฝ๊ฒ ๋ฆฌํฉํ ๋งํ ์ ์๋ ๊ฒฝ์ฐ์๋ง ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ธ์."๋ผ๋ ๊ฒฝ๊ณ ๋ ๊ดํ ์๋ ๊ฒ ์๋ ๊ฒ์ด๋ค.
์ด๋ก ์์ผ๋ก Nutri Capture ํ๋ก์ ํธ์ Cursor๋ฅผ ์ฐ๋ ๊ฒ ๋๋น ๋ณด์ด์ง๋ ์๋๋ค๋ง, ๊ทธ๋๋ ๊ณต์๋ฌธ์์ ์ฐ๋ ค(?)์ ๋ฐ๋ผ์ฃผ๊ธฐ๋ก ํ๋ค. Cursor๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ ํจ์จ ํน์ DB ์๋์ ๊ดํด ๋ ๋น ๋ฅด๋ค๋ ํ๋จ์ด ์ ๋ค๋ฉด, ๊ทธ๋ฆฌ๊ณ Cursor ์ฌ์ฉ์ ๋ํ ์ ์ฌ์ ์ธ ์๋ฌ๋ฅผ ํต์ ํ ์ ์๋ค๋ ์๊ฐ์ด ๋ ๋ค๋ฉด ๋์ค์ Cursor ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ ์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค.
#1-3 ๋๋ฒ์งธ ์๋: ํ๋ฒํ SELECT๋ฌธ
์ฌ๋ DAO์์๋ ๋ณผ ๋ฒํ ํ๋ฒํ SELECT๋ฌธ ํจ์๋ก ๊ฐ์ ํ ์ด๋ธ์ ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์จ๋ค. ๊ทธ ๊ตฌํ์ #2์ ์๋ค.
#2 ์ฝ๋
#2-1 DAO (MainDAO.kt)
...
@Dao
interface MainDAO {
...
@Query("SELECT * FROM DayMealView")
suspend fun getAllDayMeals(): List<DayMealView>
@Query("""
SELECT * FROM DayMealView
WHERE day_date <= :lastDate
AND meal_time <= :lastTime
AND meal_id != :lastId
LIMIT :limit
""")
suspend fun getNextDayMealsAfter(
lastDate: LocalDate,
lastTime: LocalTime,
lastId: Long,
limit: Int
): List<DayMealView>
@Query("SELECT * FROM DayMealView WHERE meal_id = :mealId LIMIT 1")
suspend fun getDayMeal(mealId: Long): DayMealView
}
๋ด๋ฆผ์ฐจ์์ผ๋ก DayMeal์ View์ ํ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ง์ง๋ง DayMeal๋ณด๋ค ์๊ฐ์ ์ผ๋ก ์ค๋๋ ๊ฒ์ ๊ฐ์ ธ์ค๊ฒ ํ๋ค. ํด๋น ํจ์์ ์ด๋ฆ์ getNextDayMealsAfter()๋ก ๋ช ๋ช ํ๋๋ฐ, ์ด์ ๊ฒ์๊ธ์์ ๋ง๋ ํจ์ getAllMeals()์์ ์ด๋ฆ ํต์ผ๊ฐ์ ์ํด์ getAllMeals()๋ฅผ getAllDayMeals()๋ก ๋ณ๊ฒฝํ๋ค.
๋, getDayMeal() ํจ์๋ ์ ์ํ๋ค. ๋ก๊ทธ ํ์ธ์ ์ํด ํ์ํ๋ค.
#2-2 Repository (MainRepository.kt)
...
class MainRepository(private val dao: MainDAO) {
...
suspend fun getAllDayMeals(): List<DayMealView> {
return dao.getAllDayMeals()
}
suspend fun getNextDayMealsAfter(lastDayMeal: DayMealView, limit: Int): List<DayMealView> {
return dao.getNextDayMealsAfter(
lastDayMeal.date, lastDayMeal.time, lastDayMeal.mealId, limit
)
}
suspend fun getDayMeal(mealId: Long): DayMealView {
return dao.getDayMeal(mealId)
}
}
DAO์์๋ ๋ฌธ๋ฒ์ ํ๊ณ๋ก DayMeal์ ๋ํ ์ ๋ณด๋ฅผ 3๊ฐ์ ์ธ์๋ก ๋๋ ๋ฐ์๋ค. Repository์์๋ DAO์ ๋๊ฐ์ด ๋ต์ตํ์ง ์๋๋ค. DayMeal ๊ฐ์ฒด๋ฅผ ๋ฐ์์ ์ ๋ณด๋ฅผ ๋ฝ์๋ธ๋ค. ๊ทธ๋ฆฌ๊ณ DAO์ ์ ์ ๋ฌํด์ค๋ค. ๋, DAO์์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ํจ์๋ฅผ ์ฐธ์กฐํ๋ Repository์ ํจ์๋ ์ด๋ฆ์ (getAllDayMeals()๋ก) ๋ฐ๊ฟ์ค๋ค.
DAO์ getDayMeal()๋ฅผ ์ฐธ์กฐํ๋ Repository์ getDayMeal()๋ ๋ง๋ค์ด์ค๋ค.
#2-3 ViewModel (NutrientViewModel.kt)
...
class NutrientViewModel(private val repository: MainRepository) : ViewModel() {
// (1) ํ๋ฉด ํ์์ฉ State
...
// (2) ViewModel์ฉ ๋ด๋ถ ๋ณ์
...
// (3) View์์ ๋ฐ์ ์ฒ๋ฆฌํ ์ด๋ฒคํธ
...
// (4) View๋ก๋ถํฐ ๋ฐ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ
...
// (5) DayMealView ์๋ ํ์ธ์ฉ ๋ก๊ทธ
fun log() {
viewModelScope.launch {
Log.i("interfacer_han, getAllDayMeals()", repository.getAllDayMeals().toString())
Log.i("interfacer_han, getNextDayMealsAfter()",
repository.getNextDayMealsAfter(
repository.getDayMeal(6),
100
).toString()
)
}
}
}
๋ทฐ๋ชจ๋ธ์ log() ํจ์๋ฅผ ์์ ๊ฐ์ด ๋ณ๊ฒฝํ๋ค. ์๋กญ๊ฒ ๋ง๋ 2๋ฒ์งธ ๋ก๊ทธ ๋ฉ์์ง์์๋, (DayMealView์์) mealId๊ฐ 6์ธ ๋ ์ฝ๋ ์ดํ์ ๋ ์ฝ๋๋ฅผ ๋ณด์ฌ์ค ๊ฒ์ด๋ค.
#3 ์์ฝ
๊ฐ์ํ ์ด๋ธ ์ฐธ์กฐ์ ํ์ํ DAO ๋ฐ Repository ํจ์๋ฅผ ์ ์ํ๋ค. ๋ค์ ๊ฒ์๊ธ์์ ํ๋ก ํธ์์ DAO ๋ฐ Repository์ ํจ์๋ฅผ ์ฐธ์กฐํ๊ฒ ๋ง๋ค์ด๋ณธ๋ค.
#4 ์์ฑ๋ ์ฑ
#4-1 ๋ก๊ทธ ๋ฉ์์ง (2๋ฒ์งธ ๋ก๊ทธ ๋ฉ์์ง)
[
DayMealView(
dayId=2, mealId=5, date=2024-11-12, time=07:48:08.852377, ...
),
DayMealView(
dayId=2, mealId=4, date=2024-11-12, time=07:48:08.591206, ...
),
DayMealView(
dayId=1, mealId=3, date=2024-11-11, time=07:48:07.773742, ...
)),
DayMealView(
dayId=1, mealId=2, date=2024-11-11, time=07:48:07.481481, ...
),
DayMealView(
dayId=1, mealId=1, date=2024-11-11, time=07:48:07.159289, ...
)
]
๋ก๊ทธ ๋ฉ์์ง๊ฐ ์ ์ถ๋ ฅ๋๋ ๋ชจ์ต์ด๋ค. ์ฒซ๋ฒ์งธ ๋ก๊ทธ ๋ฉ์์ง๋ ์ฌ๊ธฐ์ ์๋ค.
#4-2 ์ด ๊ฒ์๊ธ ์์ ์ Commit
GitHub - Kanmanemone/nutri-capture-new
Contribute to Kanmanemone/nutri-capture-new development by creating an account on GitHub.
github.com
#4-3 ๋ณธ ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ต์ 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 ๋ฐฑ์๋ - Room ๋ฌด๊ฒฐ์ฑ ๋ณด์ (1) | 2024.11.15 |
---|---|
Nutri Capture ํ๋ก ํธ์๋ - ์ฑํ UI ๊ตฌ์กฐ ์ก๊ธฐ (0) | 2024.11.14 |
Nutri Capture ๋ฐฑ์๋ - Room ๊ฐ์ ํ ์ด๋ธ ์ ์ธ (0) | 2024.11.10 |
Nutri Capture ๋ฐฉํฅ์ฑ - ์ฑํ UI (1) | 2024.11.08 |
Nutri Capture ๋ฐฑ์๋ - View์์ INSERT ํธ๋ฆฌ๊ฑฐ (0) | 2024.10.23 |