ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] Room ์ดํ•ด ๋ฐ ํ™œ์šฉ
    Android 2022. 1. 1. 02:32
    ๋ฐ˜์‘ํ˜•

    Room์ด๋ž€?

      SNS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ค‘์— ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ๋Š์–ด์กŒ์„ ๋•Œ ์ƒˆ๋กœ์šด ์‚ฌ์ง„๋“ค์ด ๋กœ๋”ฉ ์ค‘์ด๊ณ  ์ด์ „์— ๋ดค๋˜ ์‚ฌ์ง„๋“ค์€ ๊ณ„์† ๋ณด์ด๋Š” ๊ฒƒ์„ ๊ฒฝํ—˜ํ•ด ๋ณธ์ ์ด ๋‹ค๋“ค ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐ์ดํ„ฐ ์บ์‹ฑ์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ๋„คํŠธ์›Œํฌ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์„ ๊ฒฝ์šฐ์—๋„ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์‚ฌ์šฉ์ž๋“ค์ด ์•ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.  Android์—์„œ๋Š” SQLite ๋ผ๋Š” ๊ฐ€๋ฒผ์šด ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ž˜์™€ ๊ฐ™์€ ์ด์œ ๋กœ ์ธํ•ด SQLite ๋ณด๋‹ค Jetpack ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋œ Room์„ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

     

     

    • SQL ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘์„ฑ์ด ๋˜์—ˆ๋Š”์ง€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.  ์ด๋กœ ์ธํ•ด ์ž˜๋ชป๋œ ์ฟผ๋ฆฌ ์‚ฌ์šฉ์œผ๋กœ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ๊ธด๋‹ค๋ฉด, ์˜ค๋ฅ˜๋ฅผ ์ง์ ‘ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.  ์ด ๊ณผ์ •์ด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ํœด๋จผ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
    • SQL์ฟผ๋ฆฌ์™€ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด์™€์˜ ๋ณ€ํ™˜์ด ์ž์œ ๋กญ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ํ•„ํ„ฐ๋“ค์„ ๊ฐ๊ฐ ์ฝ๊ณ  ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ž๋กœ์„œ ๋Œ€์ž…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๋“ค์ด ๋งŽ์ด ์‚ฌ์šฉ๋  ์ˆ˜๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค.
    •  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ SQLite์— ๋น„ํ•ด ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

      ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ธํ•ด ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ๋Š” ์ •๋ณด์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ ์ถ”์ƒํ™” ๊ณ„์ธต์ธ Room ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ Room์€ SQLite์— ๋Œ€ํ•œ ์ถ”์ƒํ™” ๊ณ„์ธต(๋ณต์žกํ•œ SQLite๋กœ๋ถ€ํ„ฐ ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ๋“ค์„ ๋ชจ์•„ ์ œ๊ณตํ•˜๋Š” ๊ณ„์ธต)์„ ์ œ๊ณตํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ก์„ธ์Šค ๋™์‹œ์— SQLite๋ฅผ ์™„๋ฒฝํžˆ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. Room ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•™์Šต ์ „์— SQLite ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์‹œ๊ณ  Room์„ ํ•™์Šตํ•˜์‹ ๋‹ค๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•œ์ธต ์ˆ˜์›”ํ•˜๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ์„ ๋Š๋‚„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

    https://math-coding.tistory.com/246

     

    [Android] SQLite, SQLiteOpenHelper, Local DB ์ดํ•ด

    SQLite๋ž€? Android ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ ์•ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ข…๋ฃŒํ•˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ์ €์žฅ๋˜์–ด์•ผํ•  ํ•„์š”์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด SharedPreference๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ฒ ์ง€๋งŒ, key์™€ value์˜

    math-coding.tistory.com

     

     

     

    Room ๊ธฐ๋ณธ ๊ตฌ์„ฑ์š”์†Œ

    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

      ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์•ฑ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋กœ์ปฌ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ํฌ์ธํŠธ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ์—ญํ• 

     

    DAO (Data Access Objects)

      DAO๋Š” ์•ฑ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€, ์‚ญ์ œ, ์—…๋ฐ์ดํŠธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ์—ญํ• , ๊ทธ ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ์ฟผ๋ฆฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

     

    Entity

      ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์— ์กด์žฌํ•˜๋Š” ํ…Œ์ด๋ธ” ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

     

    https://developer.android.com/training/data-storage/room?hl=ko

      ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋ž˜์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ด€๋œ DAO ์ธ์Šคํ„ด์Šค๋ฅผ ์•ฑ์— ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์•ฑ์€ DAO๋ฅผ ํ†ตํ•ด์„œ ํ…Œ์ด๋ธ”์„ ๊ฐ€๋ฆฌํ‚ค๋Š” Entity ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ฑ์—์„œ  Entity ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ” ๋‚ด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜,  ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. 

     

    ๋ฐ˜์‘ํ˜•

     

     

    ์‹ค์Šต

      ์ด์ œ Room์„ ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณด๋ฉด์„œ ๊ตฌ์„ฑ์š”์†Œ๋“ค์„ ์ตํž ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” Android CodeLab์˜ ์˜ˆ์‹œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‹ค์Šต์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. CodeLab ๋งŒํผ ์ข‹์€ ์˜ˆ์ œ๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ฝ”๋ฃจํ‹ด์— ๋Œ€ํ•œ ํ•™์Šต์ด ๋ถ€์กฑํ•˜์—ฌ ์ด๋ถ€๋ถ„์˜ ์„ค๋ช…์€ ์ƒ๋žตํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ CodeLab์„ ์ฝ๊ณ  ์‹ค์Šตํ•ด๋ณธ ํ›„์— ์ดํ•ด๊ฐ€ ์–ด๋ ค์šด ๋ถ€๋ถ„์ด๋‚˜ ๊ฒ€ํ†  ๋Š๋‚Œ์œผ๋กœ ์•„๋ž˜ ๊ธ€์„ ์ฝ์–ด์ฃผ์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    https://developer.android.com/codelabs/android-room-with-a-view-kotlin#0

     

    ๋ทฐ๋ฅผ ์‚ฌ์šฉํ•œ Android Room - Kotlin  |  Android ๊ฐœ๋ฐœ์ž  |  Android Developers

    ์ด Codelab์—์„œ๋Š” Kotlin ์ฝ”๋ฃจํ‹ด๊ณผ ํ•จ๊ป˜ Android ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ์š”์†Œ(RoomDatabase, Entity, DAO, AndroidViewModel, LiveData)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Android ์•ฑ์„ Kotlin์œผ๋กœ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด ์ƒ˜ํ”Œ ์•ฑ์€ ๋‹จ์–ด ๋ชฉ๋ก์„ Room ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

    developer.android.com

     

    Entity ๋งŒ๋“ค๊ธฐ

    Entity(table)

     ์œ„์˜ ๊ฐ™์ด word_table ์ด๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ” ๋‚ด์˜ ์ปฌ๋Ÿผ์€ ๋ฌธ์ž์—ด์„ ๋‚˜ํƒ€๋‚ด๋Š” word ํ•˜๋‚˜๋กœ ํ…Œ์ด๋ธ” ๋‚ด์˜ ๊ธฐ๋ณธํ‚ค์— ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. Room ์—์„œ๋Š” ํ…Œ์ด๋ธ”์„ ๊ฐ€๋ฆฌํ‚ค๋Š” Entity ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ณ  ํด๋ž˜์Šค ๋‚ด ํ”„๋กœํผํ‹ฐ๋กœ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.  ๊ถ๊ทน์ ์œผ๋กœ ํ…Œ์ด๋ธ”์˜ ํ–‰์—์„œ ๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šคํ™” ํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค. 

    @Entity(tableName = "word_table")
    data class Word(
        @PrimaryKey @ColumnInfo(name = "word") val word: String
    )

      Word ํด๋ž˜์Šค๋ฅผ Room ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Annotation์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • Annotation์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค์˜ ๊ฐ ๋ถ€๋ถ„์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

     

    @Entity 

      ํด๋ž˜์Šค ์„ ์–ธ์— @Entity Annotation์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ SQLite์˜ ํ…Œ์ด๋ธ” ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ž˜์Šค ๋ช…์ด ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์ด ๋˜์ง€๋งŒ, ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์œผ๋ฉด ๊ด„ํ˜ธ ๋‚ด์˜ tableName = "ํ…Œ์ด๋ธ”๋ช…"์„ ์ž…๋ ฅํ•˜์—ฌ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์„ "word_table"๋กœ ์ง€์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

     

    @PrimaryKey

      ํ…Œ์ด๋ธ”์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ผํ•˜๊ฒŒ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธํ‚ค๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. Entity ๋‚ด์˜ ์—ฌ๋Ÿฌ ์†์„ฑ ์ค‘ ๊ธฐ๋ณธํ‚ค๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ Annotation์„ ์†์„ฑ ์•ž์— ์„ ์–ธํ•˜์—ฌ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•˜๋‚˜์˜ ์†์„ฑ์ด ์•„๋‹Œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์†์„ฑ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ณตํ•ฉ ๊ธฐ๋ณธํ‚ค๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” @Entity ์ฃผ์„ ๋‚ด์— primaryKeys = arrayOf("์†์„ฑ1", "์†์„ฑ2") ์™€ ๊ฐ™์ด ์„ค์ •ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

     

    @ColumnInfo

      ํ…Œ์ด๋ธ” ๋‚ด์˜ ์ปฌ๋Ÿผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ž˜์Šค ์†์„ฑ ์ด๋ฆ„์œผ๋กœ ์„ ์–ธ๋˜์ง€๋งŒ, ์ปฌ๋Ÿผ ๋ช…์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์œผ๋ฉด ๋‹ค์Œ Annotation์—์„œ name = "์ปฌ๋Ÿผ ๋ช…" ์„ ํ†ตํ•ด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Room์—์„œ Entity์˜ ์†์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฌด์กฐ๊ฑด public์œผ๋กœ ์„ ์–ธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

     

    @Ignore

      ๋‹ค์Œ ์˜ˆ์‹œ์—๋Š” ํ™œ์šฉ๋˜์ง€ ์•Š๋Š” Annotation์ด์ง€๋งŒ ๊ฐ€๋” ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์–ด ์„ค๋ช…ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. @Entity ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ์†์„ฑ๋“ค๋กœ ์ปฌ๋Ÿผ์„ ์ƒ์„ฑํ•˜์ง€๋งŒ, ํ…Œ์ด๋ธ” ๋‚ด์— ์œ ์ง€ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์†์„ฑ ์•ž์— @Ignore Annotation์„ ๋ถ™์ด๋ฉด ๋ฌด์‹œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

     

     

    DAO ๋งŒ๋“ค๊ธฐ

      ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด DAO๋Š” ์•ฑ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€, ์‚ญ์ œ, ์ˆ˜์ •ํ•ด์ฃผ๋Š” ์—ญํ• ๋กœ์„œ SQL ์ฟผ๋ฆฌ๋ฅผ ๋ฉ”์†Œ๋“œ์™€ ์—ฐ๊ฒฐํ•˜์—ฌ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. Room์—์„œ๋Š” ์ง์ ‘ SQL๋ฌธ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  @Insert ์™€ ๊ฐ™์€ Annotation์„ ํ™œ์šฉํ•˜์—ฌ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

    @Dao
    interface WordDao {
        @Query("SELECT * FROM word_table ORDER BY word ASC")
        fun getAlphabetizedWords() : List<Word>
    
        @Query("SELECT * FROM word_table ORDER BY word ASC")
        fun getAlphabetizedWordsWithCoroutine() : Flow<List<Word>>
    
        @Insert(onConflict = OnConflictStrategy.IGNORE)
        fun insert(word: Word)
    
        @Insert(onConflict = OnConflictStrategy.IGNORE)
        suspend fun insertWithCoroutine(word: Word)
    
        @Query("DELETE FROM word_table")
        fun deleteAll()
    
        @Query("DELETE FROM word_table")
        suspend fun deleteAllWithCoroutine()
    }

      DAO๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ถ”์ƒ ํด๋ž˜์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์„ ์–ธ๋˜์–ด์•ผ ํ•˜๋ฉฐ, SQLite ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ชจ๋“  ์ฟผ๋ฆฌ๋Š” ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Room์—์„œ๋Š” kotlin์˜ ์ฝ”๋ฃจํ‹ด๋„ ์ง€์›ํ•˜์—ฌ suspend ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DAO์—์„œ๋„ ๋‹ค์–‘ํ•œ Annotation์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด๋‹ค ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฟผ๋ฆฌ ์ž‘์„ฑ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

    @Dao

      Room์˜ Dao ํด๋ž˜์Šค๋กœ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

     

    @Insert

      @Insert Annotation์€ SQL์„ ์ œ๊ณตํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ํŠน์ˆ˜ DAO Annotation ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” Annotation์œผ๋กœ ์—ฌ๊ธฐ์—์„œ๋Š” ์“ฐ์ด์ง„ ์•Š์ง€๋งŒ ์‚ญ์ œ(@Delete), ์ˆ˜์ •(@Update) ํ•˜๋Š” Annotation๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. @Insert Annotation ์˜†์— onConflict = "์ถฉ๋Œ ์ •์ฑ…" ์€ ๋ฐ์ดํ„ฐ ์ถฉ๋Œ ์‹œ ์ฒ˜๋ฆฌํ•˜๋Š” ์ •์ฑ…์„ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. IGNORE์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถฉ๋Œํ•œ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋Š” ๋ฌด์‹œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ Conflict ์ •์ฑ…์€ ๊ณต์‹๋ฌธ์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

    @Query

      @Query๋Š” SQL ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋‚˜ ๊ธฐํƒ€ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ฉ”์†Œ๋“œ๋Š” word_table์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ์ฟผ๋ฆฌ์™€ ์—ฐ๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ™•์ธํ•˜์—ฌ ์ž˜๋ชป๋œ ์ฟผ๋ฆฌ ์ž‘์„ฑ์ด ์žˆ์„ ๊ฒฝ์šฐ์—๋Š” ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. Room์—์„œ๋Š” Entity์˜ ์†์„ฑ๊ณผ ์ฟผ๋ฆฌ์˜ ์ปฌ๋Ÿผ๋ช…์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋ฆฌํ„ด์„ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ผ๋ถ€์˜ ํ•„๋“œ์˜ ์ด๋ฆ„๋งŒ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ๋Š” ๊ฒฝ๊ณ ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์—†๋Š” ํ•„๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

     

     

    Room ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ถ”๊ฐ€

      Room ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ด๊ณ  RoomDatabase ๋ฅผ ์ƒ์†ํ•˜์—ฌ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์•ฑ ์ „์ฒด์—๋Š” Room ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค๋Š” ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ApplicationContext๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

    @Database(entities = arrayOf(Word::class), version = 1, exportSchema = false)
    public abstract class WordRoomDatabase : RoomDatabase() {
        abstract fun wordDao() : WordDao
        
        companion object{
            @Volatile
            private var INSTANCE: WordRoomDatabase? = null
    
            fun getDatabase(
                context: Context
            ): WordRoomDatabase{
                if(INSTANCE == null){
                    synchronized(this){
                        val instance = Room.databaseBuilder(
                            context.applicationContext,
                            WordRoomDatabase::class.java,
                            "word_database"
                        ).build()
                        INSTANCE = instance
                    }
                }
                return INSTANCE!!
            }
        }
    }

      WordRoomDatabase ํด๋ž˜์Šค๋Š” RoomDatabase๋ฅผ ํ™•์žฅํ•œ ์ถ”์ƒํด๋ž˜์Šค๋กœ @Database Annotation์„ ์ž‘์„ฑํ•˜์—ฌ Room ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋˜๋„๋ก ์ฒ˜๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํด๋ž˜์Šค ๋‚ด๋ถ€์—๋Š” DAO์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”์ƒ getter ๋ฉ”์†Œ๋“œ๊ฐ€ ์กด์žฌํ•˜์—ฌ DAO๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด WordRoomDatabase๋Š” ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์ •์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

     

    @Database

       @Database๋Š” Room ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋„๋ก ์—ฐ๊ฒฐํ•ด์ฃผ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์— ์†ํ•œ ํ…Œ์ด๋ธ”๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒ„์ „ ๋ช…์„ ์ถ”๊ฐ€๋กœ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.  ํ…Œ์ด๋ธ”์€ entities์— Entity ํด๋ž˜์Šค๋“ค์„ ์ง€์ •ํ•˜๊ณ  version์€ ์ตœ์ดˆ ์ƒ์„ฑ์ด๋‹ˆ 1๋กœ ์ง€์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์Šคํ‚ค๋งˆ๊ฐ€ ๋ณ€๊ฒฝ์ด ํ•„์š” ์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ํ•„์š”ํ•œ๋ฐ ์ด ๋•Œ ๋ฒ„์ „๋„ ๊ธฐ์กด์˜ ๋ฒ„์ „๋ณด๋‹ค ๋†’์—ฌ์„œ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

     

    @Volatile

      Room๊ณผ ๊ด€๋ จ์žˆ๋Š” Annotation์€ ์•„๋‹ˆ์ง€๋งŒ, ํ•ด๋‹น Annotation์ด ์ง€์ •๋œ ์†์„ฑ์€ Cache์—์„œ๊ฐ€ ์•„๋‹Œ ๋ฉ”์ธ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ง์ ‘ ์ฝ๊ณ  ์“ฐ๋Š” ์ž‘์—…์„ ๋ช…์‹œํ•˜๋„๋ก ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค์— ์ง€์ •ํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

      WordRoomDatabase๋ฅผ ์ฒ˜์Œ ์•ก์„ธ์Šค ์‹œ RoomDatabase Builder๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ApplicationContext์—์„œ RoomDatabase ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฆ„์„ "word_database"๋กœ ์ง€์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

     

     

    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šคํ™”

      ์•ฑ์—์„œ Room ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค๋Š” ํ•˜๋‚˜๋งŒ ํ•„์š”ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Application ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    class WordsApplication : Application() {
        val database by lazy { WordRoomDatabase.getDatabase(this) }
    }

      ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค๋Š” ์•ฑ์ด ์‹œ์ž‘ํ•  ๋•Œ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ํ•„์š”ํ•  ๋•Œ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋ฏ€๋กœ kotlin ์†์„ฑ ์œ„์ž„์ธ by lazy๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

    <application
            android:name=".WordsApplication"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/Theme.Roomexample">
            ...

      Application์„ ๋งŒ๋“  ํ›„ Manifest ์— name ์†์„ฑ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€์ •์„ ํ•ด์•ผ ์ ์šฉ์ด ๋ฉ๋‹ˆ๋‹ค.

     

     

     

    ์ •๋ฆฌ

      Room์ด SQLite์— ๋น„ํ•ด ์ฟผ๋ฆฌ ์ž‘์„ฑ์ด ๊ฐ„ํŽธํ•˜๊ณ  ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ธก๋ฉด์—์„œ ๋งŽ์€ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. CodeLab์—์„œ๋Š” MVVM ์•„ํ‚คํ…์ฒ˜ ๊ธฐ๋ฐ˜์˜ Repository Pattern์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์ž์ฒด๋ฅผ ์ถ”์ƒํ™”ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์ฟผ๋ฆฌ๋Š” ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„ ์˜ˆ์‹œ๋Š” ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. CodeLab์—์„œ๋Š” ์ฝ”๋ฃจํ‹ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ํ•™์Šต ๋ฒ”์œ„ ์ด์ƒ์ธ๊ฒƒ ๊ฐ™์•„ ๋‹ค์Œ์— ์ฝ”๋ฃจํ‹ด์„ ๋ณ„๋„๋กœ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ธ€์€ ์—ฌ๊ธฐ์„œ ๋งˆ๋ฌด๋ฆฌ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ƒˆ๋กญ๊ฒŒ ํ•™์Šตํ•œ ๋‚ด์šฉ(ex. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, ํ…Œ์ด๋ธ” ๊ด€๊ณ„ ์ •์˜ ๋“ฑ )์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

     

    https://github.com/ows3090/Android_CodeLab-Practice/tree/master/roomexample

     

    GitHub - ows3090/Android_CodeLab-Practice: I plan to learn how to use various components through Android Codelab

    I plan to learn how to use various components through Android Codelab - GitHub - ows3090/Android_CodeLab-Practice: I plan to learn how to use various components through Android Codelab

    github.com

     

    ๋ฐ˜์‘ํ˜•
Designed by Tistory.