๊ฐœ๋ฐœ ์ผ์ง€ ๐Ÿ’ป/Swemo

Nutri Capture - DAO ์† ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜ ์ˆ˜์ •

interfacer_han 2024. 11. 26. 19:58

#1 ๊ฐœ์š”

ํ”„๋กœ์ ํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Room) ๋ถ€๋ถ„์—์„œ ์ž‘์„ฑํ–ˆ๋˜ DAO ํ•จ์ˆ˜์˜ ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.
 

#2 ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜ - ORDER BY

#2-1 ๋ฌธ์ œ ์ฝ”๋“œ

...

@Dao
interface MainDAO {
    ...

    @Query("SELECT * FROM DayMealView")
    suspend fun getAllDayMeals(): List<DayMealView>

    @Query("SELECT * FROM DayMealView LIMIT :limit")
    suspend fun getAllDayMeals(limit: Int): 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
}

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ณต์ˆ˜์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ SELECTํ•  ๋•Œ, ์ •์งํ•˜๊ฒŒ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋Š”๋‹ค. ๋ฌด์Šจ ๋ง์ด๋ƒ๋ฉด, ๋ ˆ์ฝ”๋“œ์— ์ •๋ ฌ๋œ ์ˆœ์„œ ๊ทธ๋Œ€๋กœ๋ฅผ ์ง€์ผœ์„œ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์–˜๊ธฐ๋‹ค. DayMealView์— ์‚ฝ์ž…๋˜์–ด์žˆ๋˜ ์ˆœ์„œ ๊ทธ๋Œ€๋กœ๋ฅผ ์ง€์ผœ์„œ ๋ฐ˜ํ™˜๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ์›ฌ๋งŒํ•˜๋ฉด ์ˆœ์„œ๊ฐ€ ์ง€์ผœ๊ฒ ์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ๊ทธ๋ ‡์ง€๋Š” ์•Š๋‹ค๋Š” ์–˜๊ธฐ๋‹ค.
 

#2-2 ํ•ด๊ฒฐ

...

@Dao
interface MainDAO {
    ...

    @Query("""
    SELECT * FROM DayMealView
    ORDER BY day_date DESC,
             meal_time DESC,
             meal_id DESC
    """)
    suspend fun getAllDayMeals(): List<DayMealView>

    @Query("""
    SELECT * FROM DayMealView
    ORDER BY day_date DESC,
             meal_time DESC,
             meal_id DESC
    LIMIT :limit
    """)
    suspend fun getAllDayMeals(limit: Int): List<DayMealView>

    @Query("""
    SELECT * FROM DayMealView 
    WHERE day_date <= :lastDate
      AND meal_time <= :lastTime 
      AND meal_id != :lastId
    ORDER BY day_date DESC,
             meal_time DESC,
             meal_id DESC
    LIMIT :limit
    """)
    suspend fun getNextDayMealsAfter(
        lastDate: LocalDate,
        lastTime: LocalTime,
        lastId: Long,
        limit: Int
    ): List<DayMealView>

    @Query("""
    SELECT * FROM DayMealView
    WHERE meal_id = :mealId
    ORDER BY day_date DESC,
             meal_time DESC,
             meal_id DESC
    LIMIT 1
    """)
    suspend fun getDayMeal(mealId: Long): DayMealView
}

ORDER BY๋ฌธ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. getDayMeal()์€ ๋ณต์ˆ˜ ๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ORDER BY๋ฌธ์ด ํ•„์š”์—†๋‹ค. ํ•˜์ง€๋งŒ, ๋จธ์ง€์•Š์€ ๋ฏธ๋ž˜์— getDayMeal()๋ฅผ ๋ณต์‚ฌใ†๋ถ™์—ฌ๋„ฃ๊ธฐํ•ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” DAO ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ ๊ฐ™์€ ์˜ˆ๊ฐ์ด ๋“ค๊ธฐ์— (์‹ค์ˆ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด) ๊ทธ๋ƒฅ ๋ƒ…๋‘๊ฒ ๋‹ค. ์ด ๋ถ€๋ถ„์€ ๋‚˜์ค‘์— ๋ฆฌํŒฉํ† ๋ง์„ ๋ชฉ์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋‹ค๋“ฌ์„ ๋•Œ ์ˆ˜์ •๋  ๊ฒƒ์ด๋‹ค.

#3 ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜ - AND

#3-1 ๋ฌธ์ œ ์ƒํ™ฉ

... meal_id day_date meal_time ...
... ... ... ... ...
... 81 2024-11-25 09:50:57.13994 ...
... 80 2024-11-13 18:41:07.954925 ...
... ... ... ... ...

'meal_id๊ฐ€ 80์ธ ๋ ˆ์ฝ”๋“œ' ๋‹ค์Œ ๋ ˆ์ฝ”๋“œ์ธ 'meal_id๊ฐ€ 81์ธ ๋ ˆ์ฝ”๋“œ'๊ฐ€ LazyColumn ์ƒ์—์„œ Load๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ด๊ฒƒ๋งŒ ๋ด์„œ๋Š” ๋ฌธ์ œ์˜ ์›์ธ์„ ์•Œ ์ˆ˜ ์—†์—ˆ์ง€๋งŒ, day_date๊ฐ€ ์ฐจ์ด๋‚œ๋‹ค๋Š” ์ ์—์„œ ๋ญ”๊ฐ€ ์ž˜๋ชป๋˜์ง€ ์•Š์•˜๋‚˜ ์ถ”์ธก์ด ๋œ๋‹ค.
 

#3-2 ๋ฌธ์ œ ์ฝ”๋“œ

...

@Dao
interface MainDAO {
    ...

    @Query("""
    SELECT * FROM DayMealView 
    WHERE day_date <= :lastDate
      AND meal_time <= :lastTime 
      AND meal_id != :lastId
    ORDER BY day_date DESC,
             meal_time DESC,
             meal_id DESC
    LIMIT :limit
    """)
    suspend fun getNextDayMealsAfter(
        lastDate: LocalDate,
        lastTime: LocalTime,
        lastId: Long,
        limit: Int
    ): List<DayMealView>

    ...
}

๋ฌธ์ œ๋Š” AND์˜ ๋‚จ๋ฐœ์ด์—ˆ๋‹ค. date๊ฐ€ ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด์„œ ๋™์‹œ์— time์ด ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด์„œ ๋™์‹œ์— meal_id๋Š” ๋‹ฌ๋ผ์•ผํ•œ๋‹ค๋Š” ์กฐ๊ฑด. ์ด ์กฐ๊ฑด์€ AND์˜ ๋‚˜์—ด๋กœ ๊ตฌ์„ฑ๋˜์—ˆ๋Š”๋ฐ, ์ด๋Ÿฌ๋ฉด ๋‚ด๊ฐ€ ์ •ํ™•ํžˆ ์›ํ•˜๋Š” ์กฐ๊ฑด๊ณผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ์กฐ๊ฑด์ด ๋œ๋‹ค.
 
DayMealView๋Š” 1์ฐจ๋กœ date์— ๋Œ€ํ•ด ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ณ , date๊ฐ€ ๊ฐ™์œผ๋ฉด time์— ๋Œ€ํ•ด time๋งˆ์ € ๊ฐ™์œผ๋ฉด id์— ๋Œ€ํ•ด ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ํ…Œ์ด๋ธ”์ด๋ฉฐ, ์ด ํ…Œ์ด๋ธ”์˜ ์ •๋ ฌ ์กฐ๊ฑด์„ ์ค€์ˆ˜ํ•˜์—ฌ WHERE๋ฌธ์„ ์ž‘์„ฑํ–ˆ์–ด์•ผ ํ–ˆ๋‹ค. ์ œ๋Œ€๋กœ ๋‹ค์‹œ ์ฟผ๋ฆฌ์˜ WHERE๋ฌธ์„ ์ˆ˜์ •ํ•ด ๋‚ด๊ฐ€ ์ •ํ™•ํžˆ ์›ํ•˜๋Š” ์กฐ๊ฑด๊ณผ ๊ฐ™๊ฒŒ ๋งŒ๋“ค์–ด๋ณธ๋‹ค.
 

#3-3 ํ•ด๊ฒฐ

...

@Dao
interface MainDAO {
    ...

    @Query("""
    SELECT * FROM DayMealView 
    WHERE day_date < :lastDate
       OR (day_date = :lastDate AND meal_time < :lastTime)
       OR (day_date = :lastDate AND meal_time = :lastTime AND meal_id < :lastId)
    ORDER BY day_date DESC,
             meal_time DESC,
             meal_id DESC
    LIMIT :limit
    """)
    suspend fun getNextDayMealsAfter(
        ...
    ): ...

    ...
}

#3-2์—์„œ ๋งํ•œ ๋‚ด๊ฐ€ ์ •ํ™•ํžˆ ์›ํ•˜๋Š” ์กฐ๊ฑด ๊ทธ๋Œ€๋กœ๋ฅผ ์ฟผ๋ฆฌ๋ฌธ์— ๋„ฃ์—ˆ๋‹ค. WHERE ๋ฌธ์ด DayMealView์˜ ์ •๋ ฌ ์กฐ๊ฑด์„ ์ค€์ˆ˜ํ•˜๊ฒŒ ๋งŒ๋“  ๊ฒƒ์ด๋‹ค.
 

#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