Room - boostcampwm-2024/and04-Nature-Album GitHub Wiki
์ฑ ๋ฐ์ดํฐ ๋ฐ ํ์ผ
Android Developers ์ฑ ๋ฐ์ดํฐ ๋ฐ ํ์ผ
์ธ๋ถ ์ ์ฅ์ ์ฌ์ฉ ๊ถํ ๋ฐ ์ก์ธ์ค ๊ถํ
Android์์ ์ ์ํ๋ ์ ์ฅ์ ๊ด๋ จ ๊ถํ์ READ_EXTERNAL_STORAGE
, WRITE_EXTERNAL_STORAGE
, MANAGE_EXTERNAL_STORAGE
์
๋๋ค.
์ด์ ๋ฒ์ ์ Android์์๋ ์ฑ์ด ์ธ๋ถ ์ ์ฅ์์ ์ฑ๋ณ ๋๋ ํฐ๋ฆฌ ์ธ๋ถ์ ์๋ ํ์ผ์ ์ก์ธ์คํ ์ ์๋๋ก READ_EXTERNAL_STORAGE
๊ถํ์ ์ ์ธํด์ผ ํ์ต๋๋ค. ๋ํ ์ฑ๋ณ ๋๋ ํฐ๋ฆฌ ์ธ๋ถ์ ํ์ผ์ ์ธ ์ ์๋๋ก WRITE_EXTERNAL_STORAGE
๊ถํ๋ ์ ์ธํด์ผ ํ์ต๋๋ค.
์ต์ ๋ฒ์ ์ Android๋ ์ฑ์ด ์ง์ ๋ ํ์ผ์ ์ก์ธ์คํ๊ณ ํ์ผ์ ์ฐ๋ ๊ธฐ๋ฅ์ ๊ฒฐ์ ํ๋ ๋ฐ ํ์ผ์ ์์น๋ณด๋ค ์ฉ๋์ ๋ ๋ง์ด ์์กดํฉ๋๋ค. ํนํ ์ฑ์ด Android 11(API ์์ค 30) ์ด์์ ํ๊ฒํ
ํ๋ฉด WRITE_EXTERNAL_STORAGE
๊ถํ์ ์ฑ์ ์ ์ฅ์ ์ก์ธ์ค์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. ์ด ์ฉ๋ ๊ธฐ๋ฐ ์ ์ฅ์ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ฉด ์ฑ์ด ์ค์ ๋ก ์ฌ์ฉํ๋ ๊ธฐ๊ธฐ์ ํ์ผ ์์คํ
์์ญ์๋ง ์ก์ธ์คํ ์ ์๊ฒ ๋๋ฏ๋ก ์ฌ์ฉ์ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ๊ฐ ํฅ์๋ฉ๋๋ค.
Android 11์์๋ ์ฑ๋ณ ๋๋ ํฐ๋ฆฌ์ MediaStore
์ธ๋ถ์ ํ์ผ์ ๋ํ ์ฐ๊ธฐ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ๋ MANAGE_EXTERNAL_STORAGE
๊ถํ์ ๋์
ํ์ต๋๋ค. ์ด ๊ถํ์ ๊ดํด ํ์ตํ๊ณ ๋๋ถ๋ถ์ ์ฑ์์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ด๋ฅผ ์ ์ธํ์ง ์์๋ ๋๋ ์ด์ ๋ฅผ ์์๋ณด๋ ค๋ฉด ์ ์ฅ์ ๊ธฐ๊ธฐ์์ ๋ชจ๋ ํ์ผ์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๊ดํ ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํ์ธ์.
Room์ด๋?
Room์ ์ค๋งํธํฐ ๋ด์ฅ(๋ก์ปฌ) DB์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
ํ์ ์ฌ์ฉ์๊ฐ ๋ฉ๋ชจ ์ ์ฅ, ์ผ์ ์ ์ฅ ๋ฑ ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ฅ DB์ ์ ์ฅํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋, SQLite๋ผ๋ DB๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋๋ฐ ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฒ์ด Room์ด๋ค.
[Storage] ์๋๋ก์ด๋ ์ ์ฅ์ ์ ๋ฆฌ
- ์๋๋ก์ด๋ ์์คํ ์์ ์์คํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ชจ๋ SQLite๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ง๋ง, ๊ทธ ์ญํ ๊ณผ ์ ๊ทผ ๋ฐฉ์์์ ์ฐจ์ด๊ฐ ์๋ค.
๊ตฌ๋ถ | ์์คํ ๋ฐ์ดํฐ๋ฒ ์ด์ค | ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค |
---|---|---|
์ญํ | ์์คํ ์ค์ , ์ฐ๋ฝ์ฒ, ๋ฏธ๋์ด ํ์ผ ์ ๋ณด ๋ฑ ์์คํ ์ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌ | ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌ |
์ ์ฅ ์์น | ์๋๋ก์ด๋ ์์คํ ์์ญ์ ์์นํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก /data/data/com.android.providers ๊ฒฝ๋ก์ ์์ | ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฉ ๋๋ ํ ๋ฆฌ์ ์์นํ๋ฉฐ, /data/data/[ํจํค์ง๋ช ]/databases ๊ฒฝ๋ก์ ์์ |
์ ๊ทผ ๋ฐฉ๋ฒ | ์ฝํ ์ธ ํ๋ก๋ฐ์ด๋(Content Provider)๋ฅผ ํตํด ์ ๊ทผํ๋ฉฐ, ContentResolver๋ฅผ ์ฌ์ฉ | SQLiteOpenHelper ๋๋ Room ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ง์ ์ ๊ทผ |
๋ณด์ ๋ฐ ๊ถํ | ๋ฏผ๊ฐํ ์ ๋ณด์ด๋ฏ๋ก ์ ๊ทผ ์ ํน์ ๊ถํ์ด ํ์ํ๋ฉฐ, ๋ณด์์ด ๊ฐํ๋์ด ์์ | ํด๋น ์ ํ๋ฆฌ์ผ์ด์ ๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋ฉฐ, ๋ค๋ฅธ ์ฑ์ ์ ๊ทผํ ์ ์์ |
์์ | ์ฐ๋ฝ์ฒ, ์บ๋ฆฐ๋, ๋ฏธ๋์ด ํ์ผ ์ ๋ณด ๋ฑ | ๋ฉ๋ชจ ์ฑ์ ๋ฉ๋ชจ ๋ด์ฉ, ๊ฒ์ ์ฑ์ ์ฌ์ฉ์ ์ค์ ๋ฑ |
- ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ํตํด ์๋๋ก์ด๋๋ ์์คํ ๋ฐ์ดํฐ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ์ฌ ๋ณด์๊ณผ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์ง
- ๊ฐ๋ฐ์๋ ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํน์ฑ๊ณผ ์ ๊ทผ ๋ฐฉ์์ ์ดํดํ์ฌ ์ ์ ํ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํด์ผ ํจ
Android Developers ๋ฐ์ดํฐ ๋ ์ด์ด ๋น๋
Android Developers SQL์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ
[Android] ์๋๋ก์ด๋ - SQLLiteDatabase ๊ตฌํํ๊ธฐ
Android Developers SQLiteDatabase
GDSC HUFS [5ํ] ์ฝํ๋ฆฐ ์๋๋ก์ด๋ ๊ธฐ์ด ๊ฐ์_41,42 | SQLite, Room
์๋๋ก์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ฐ์ดํฐ๋ฅผ ์๊ตฌ์ ์ผ๋ก ์ ์ฅํ๊ธฐ ์ํด ์ด๊ธฐ์๋ SQLiteOpenHelper
ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ด๋ฆฌํด์๋ค. SQLiteOpenHelper
๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ๊ณผ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์กฐํํ๊ธฐ ์ํด SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์์ฑํด์ผ ํ๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ๋ฐฉ์์ ์ปดํ์ผ ์์ ์์ ์ฟผ๋ฆฌ์ ์ ํจ์ฑ์ ๊ฒ์ฆํ ์ ์๊ณ , ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๊ฐ ๋ง์ ์ ์ง๋ณด์์ ํ์ฅ์ฑ์ด ๋จ์ด์ง๋ ๋จ์ ์ด ์๋ค.
โผ ์๋์ฒ๋ผ ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํด์ผ ํ๊ธฐ ๋๋ฌธ
Android Developers SQLite๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ ์ฅ
private const val SQL_CREATE_ENTRIES =
"CREATE TABLE ${FeedEntry.TABLE_NAME} (" +
"${BaseColumns._ID} INTEGER PRIMARY KEY," +
"${FeedEntry.COLUMN_NAME_TITLE} TEXT," +
"${FeedEntry.COLUMN_NAME_SUBTITLE} TEXT)"
private const val SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS ${FeedEntry.TABLE_NAME}"
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Room ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋์ ๋์๋ค. Room์ SQLite์ ๋ํ ์ถ์ํ ๋ ์ด์ด๋ฅผ ์ ๊ณตํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ๋ณด๋ค ๊ฐํธํ๊ณ ์์ ํ๊ฒ ์ํํ ์ ์๋๋ก ๋๋๋ค. Room์ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ ์๊ฐ์ SQL ์ฟผ๋ฆฌ์ ์ ํจ์ฑ์ ๊ฒ์ฆํ ์ ์์ด ์ค๋ฅ๋ฅผ ์ค์ด๊ณ , Entity, DAO, Database๋ก ๊ตฌ์ฑ๋ ๊ตฌ์กฐ๋ฅผ ํตํด ๋ช ํํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์ฑ์ ์ ๊ณตํ๋ค . Room์ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ค์ฌ ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ด๋ฉฐ, SQLite๋ณด๋ค ํ๋์ ์ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ ๋ฐฉ์์ ์ง์ํ๋ค.
Android Developers Room์ ์ฌ์ฉํ์ฌ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ ์ ์ฅ
Room ์ง์์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ SQLite๋ฅผ ์๋ฒฝํ ํ์ฉํ๋ฉด์ ์ํํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ก์ธ์ค๊ฐ ๊ฐ๋ฅํ๋๋ก SQLite์ ์ถ์ํ ๊ณ์ธต์ ์ ๊ณตํฉ๋๋ค. ํนํ Room์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ด ์์ต๋๋ค.
- SQL ์ฟผ๋ฆฌ์ ์ปดํ์ผ ์๊ฐ ํ์ธ
- ๋ฐ๋ณต์ ์ด๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์ต์ํํ๋ ํธ์ ์ฃผ์
- ๊ฐ์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด์ ๊ฒฝ๋ก
์ด๋ฌํ ์ ์ ๊ณ ๋ คํ ๋ SQLite API๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๋์ Room์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
fun loadAllByIds(userIds: IntArray): List<User>
@Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
"last_name LIKE :last LIMIT 1")
fun findByName(first: String, last: String): User
@Insert
fun insertAll(vararg users: User)
@Delete
fun delete(user: User)
}
๋ฐ๋ผ์, ๊ธฐ์กด์ SQLiteOpenHelper
๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ Room์ผ๋ก ์ ํํ๋ฉด ๊ฐ๋ฐ ํจ์จ์ฑ๊ณผ ์ฝ๋ ํ์ง์ ๋์ผ ์ ์๋ค.