-
[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
Room ๊ธฐ๋ณธ ๊ตฌ์ฑ์์
๋ฐ์ดํฐ๋ฒ ์ด์ค
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ฑ์ ์ ์ฅ๋์ด ์๋ ๋ก์ปฌ ๋ฐ์ดํฐ์ ๋ํ ์ก์ธ์ค ํฌ์ธํธ๋ฅผ ์ ๊ณตํด์ฃผ๋ ์ญํ
DAO (Data Access Objects)
DAO๋ ์ฑ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ, ์ญ์ , ์ ๋ฐ์ดํธ ์์ ์ ํ ์ ์๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํด์ฃผ๋ ์ญํ , ๊ทธ ์ธ์๋ ๋ค์ํ ์ฟผ๋ฆฌ ์ฌ์ฉ ๊ฐ๋ฅ
Entity
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์ ์กด์ฌํ๋ ํ ์ด๋ธ ๊ฐ๋ฆฌํต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ด๋ DAO ์ธ์คํด์ค๋ฅผ ์ฑ์ ์ ๊ณตํฉ๋๋ค. ์ดํ ์ฑ์ DAO๋ฅผ ํตํด์ ํ ์ด๋ธ์ ๊ฐ๋ฆฌํค๋ Entity ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฑ์์ Entity ํด๋์ค๋ฅผ ์ด์ฉํ์ฌ ํ ์ด๋ธ ๋ด์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋, ๋ฐ์ดํฐ๋ฅผ ์์ ํฉ๋๋ค.
๋ฐ์ํ์ค์ต
์ด์ Room์ ์ง์ ์ฌ์ฉํด๋ณด๋ฉด์ ๊ตฌ์ฑ์์๋ค์ ์ตํ ํ์๊ฐ ์์ต๋๋ค. ์ ๋ Android CodeLab์ ์์๋ฅผ ํ์ฉํ์ฌ ์ค์ต์ ํ์์ต๋๋ค. CodeLab ๋งํผ ์ข์ ์์ ๋ ์๋ค๊ณ ์๊ฐํ๊ณ ์ฝ๋ฃจํด์ ๋ํ ํ์ต์ด ๋ถ์กฑํ์ฌ ์ด๋ถ๋ถ์ ์ค๋ช ์ ์๋ตํ๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ชจ๋ CodeLab์ ์ฝ๊ณ ์ค์ตํด๋ณธ ํ์ ์ดํด๊ฐ ์ด๋ ค์ด ๋ถ๋ถ์ด๋ ๊ฒํ ๋๋์ผ๋ก ์๋ ๊ธ์ ์ฝ์ด์ฃผ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
https://developer.android.com/codelabs/android-room-with-a-view-kotlin#0
Entity ๋ง๋ค๊ธฐ
์์ ๊ฐ์ด 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
๋ฐ์ํ'Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] Native Application(C/C++), NDK build ๋ฐ CMake ๊ตฌ์ฑ (0) 2022.02.14 [Android] ContentProvider ๊ตฌํ ๋ฐ ์ฌ์ฉ๋ฒ (0) 2022.02.05 [Android] SQLite, SQLiteOpenHelper, Local DB ์ดํด (0) 2021.11.30 [Android] Context, ContextWrapper, ContextImpl ์ดํด (0) 2021.11.21 [Android] Preference, Shared Preference? (0) 2021.11.19 - SQL ์ฟผ๋ฆฌ์ ๋ํด์ ์ฌ๋ฐ๋ฅด๊ฒ ์์ฑ์ด ๋์๋์ง ์ปดํ์ผ ํ์์ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ์๋ชป๋ ์ฟผ๋ฆฌ ์ฌ์ฉ์ผ๋ก ์ํฅ์ ๋ฐ๋ ๋ฐ์ดํฐ๊ฐ ์๊ธด๋ค๋ฉด, ์ค๋ฅ๋ฅผ ์ง์ ์
๋ฐ์ดํธ๋ฅผ ํด์ผํฉ๋๋ค. ์ด ๊ณผ์ ์ด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ณ ํด๋จผ ์๋ฌ๋ฅผ ๋ฐ์์ํค๊ธฐ๋ ํฉ๋๋ค.