๐Android์ ๋ชจ๋ ๊ฒ : 1๏ธโฃSharedPreference, 2๏ธโฃDataStore
https://goni95.tistory.com/173
๐Android์ ๋ชจ๋ ๊ฒ ๊ฐ๋
๋ชฉ ์ฐจ ์์ Android ๐Android์ ๋ชจ๋ ๊ฒ : 1๏ธโฃAndroid, 2๏ธโฃAndroid SDK, 3๏ธโฃPlatform Architecture ๐Android์ ๋ชจ๋ ๊ฒ ๊ฐ๋ : 1๏ธโฃApp Manifest, 2๏ธโฃAndroid Context, 3๏ธโฃApp Components ๐Androi..
goni95.tistory.com
1๏ธโฃSharedPreference
SharedPreference๋ DB๋ฅผ ์ฌ์ฉํ๊ธฐ์ ๋ถ๋ด์ค๋ฌ์ด ๊ฐ๋จํ ์ค์ ๊ฐ ๋๋ ๋ฌธ์์ด ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํค-๊ฐ ์์ผ๋ก ๋ก์ปฌ์ ์ ์ฅํ ์ ์๋ ๋ฐ์ดํฐ ์ ์ฅ์๋ก ํด๋น ๋ฐ์ดํฐ์ ๋ํ ํ์ผ์ด ์ ํ๋ฆฌ์ผ์ด์ ๋๋ ํ ๋ฆฌ ๋ด(data/data/ํจํค์ง๋ช /shared_prefs/SharedPreference๋ช .xml)์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ์ ํ๋ฉด ํด๋น ํ์ผ๋ ํจ๊ป ์ญ์ ๋ฉ๋๋ค.
Google์์ SharedPreference ๋์ Datastore๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ๊ทน ๊ถ์ฅํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์์ ๋์ ์ฌ์ฉ๋ฒ๋ง ์์ฑํ๊ฒ ์ต๋๋ค.
SharedPreference ๋จ์
- ์ค์ XML ํ์ผ I/O ์์ ์ ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ UI Thread์์ ์์ ํ ๊ฒฝ์ฐ ์์ ํ์ง ์๋ค.
- Runtime Exception์ผ๋ก ๋ถํฐ ์์ ํ์ง ์๋ค.
- XML ํ์ผ์ด๊ธฐ์ ์ธ๋ถ์์ ์ฝ๊ฒ ํ์ผ์ ์ฝ์ ์ ์๋ค. (Datastore๋ ๋์ผ)
- ๋น๋๊ธฐ API๋ฅผ ์ ๊ณตํ์ง๋ง Listener๋ฅผ ํตํด์๋ง ๊ฐ์ ์ฝ์ ์ ์๋ค.
- *type safety๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.
SharedPreference ์ ํ
getPreferences(int mode) : ๋ณ๋์ ํ์ผ๋ช ์ ์ง์ ํ์ง ์๊ณ ์๋์ผ๋ก ํธ์ถํ ์กํฐ๋นํฐ ์ด๋ฆ์ ํ์ผ ๋ด์ ์ ์ฅ๋ฉ๋๋ค. ์ฆ, ํ๋์ ํ์ผ์ ๋ค๋ฃฐ ๊ฒ์ด๋ผ๋ฉด ์ด ๋ฉ์๋๋ฅผ ํตํด ์ธ์คํด์ค๋ฅผ ์ป์ด์ค๋ฉด ๋ฉ๋๋ค.
getSharedPreferences(String name, int mode) : ํ์ผ๋ช ์ ๋ํ ์ ๋ณด๋ฅผ ์ง์ ํ์ฌ XML ํ์ผ์ ์์ฑํฉ๋๋ค. ์ฆ, ์ ์ฅํ ๋ฐ์ดํฐ๊ฐ ๋ง์ ์ฌ๋ฌ ๊ฐ์ ํ์ผ๋ก ๋๋์ด ๊ด๋ฆฌํ๊ณ ์ ํ๋ค๋ฉด ์ด ๋ฉ์๋๋ฅผ ํตํด ์ธ์คํด์ค๋ฅผ ์ป์ด์ค๋ฉด ๋ฉ๋๋ค.
์์์ ๋ณผ ์ ์๋ฏ์ด SharedPreference์ ์ธ์คํด์ค๋ฅผ ์ป๊ณ ์ ํ๋ ๊ฒฝ์ฐ mode๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋๊ฒจ์ผ ํ๋๋ฐ, Context๋ฅผ ํตํด ์ป์ ์ ์์ต๋๋ค.
3๊ฐ์ง mode๊ฐ ์์ง๋ง ์ธ๋ถ ์ฑ์์ ์ ๊ทผํ ์ ์๋๋ก ์ค์ ํ๋ mode์ธ MODE_WORD_READABLE / WRITEABLE๋ ๋ณด์์์ ์ด์ ๋ก Android 4.2 (JELLYBEAN_MR1 : API 17) ๋ถํฐ deprecation ๋์๊ณ ์ฑ ๋ด์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ MODE_PRIVATE๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
SharedPreference๋ก ๋ฐ์ดํฐ ์ ์ฅ
ํ๋ ค๋ฉด SharedPreference ์ธ์คํด์ค๋ก ๋ถํฐ Editor ํด๋์ค์ ํจ์์ธ edit()๋ฅผ ํตํด Editor ๊ฐ์ฒด๋ฅผ ์ป์ด์ put***() ๋ฉ์๋๋ฅผ ํตํด ๋งค๊ฐ๋ณ์๋ก key, value๋ฅผ ๋๊ฒจ ํค-๊ฐ ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฉด ๋ฉ๋๋ค.
๊ทธ ํ SharedPreference์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๋ฐ์ํ๊ธฐ ์ํด์ commit(), apply() ๋ฉ์๋๋ฅผ ํธ์ถํด์ฃผ๋ฉด ๋ฉ๋๋ค.
commit() ๋ฉ์๋๋ ํธ์ถ ์ ์ค๋ ๋๋ฅผ block ์ํค๊ณ ์ปค๋์์ ์ ์ฅ์ด ์๋ฃ๋๋ฉด Boolean์ ๋ฆฌํดํ๋ฉด์ block์ ํด์ ํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๊ฐ์ด ํ์ํ ๊ฒ์ด ์๋๋ผ๋ฉด apply() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
SharedPreference์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
SharedPreference์ ์ธ์คํด์ค๋ก ๋ถํฐ get***(String key, Type value) ๋ฉ์๋๋ฅผ ํตํด ๋งค๊ฐ๋ณ์๋ก key, defaultValue๋ฅผ ๋๊ฒจ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
SharedPreference์ ๋ฐ์ดํฐ ์ญ์ (ํน์ ๋ฐ์ดํฐ / ๋ชจ๋ ๋ฐ์ดํฐ)
ํน์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ณ ์ถ๋ค๋ฉด Editor ๊ฐ์ฒด๋ฅผ ํตํด remove(String key) ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ณ , ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ณ ์ถ๋ค๋ฉด Editor ๊ฐ์ฒด๋ฅผ ํตํด clear() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๊ทธ ํ SharedPreference์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๋ฐ์ํ๊ธฐ ์ํด์ commit(), apply() ๋ฉ์๋๋ฅผ ํธ์ถํด์ฃผ๋ฉด ๋ฉ๋๋ค.
Datastore๋ฅผ ํ๋ฒ ๊ณต๋ถํด๋ณผํ ๋ฐ ์ฐ์ ์๋๋ก์ด๋์์ ๋ก์ปฌ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ Datastore, SharePreferences, Room ๋ฑ์ ์ฌ์ฉํฉ๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ์ ์ ๋ณต์กํ ๋ฐ์ดํฐ ์ ์ฅ๊ณผ ๋ถ๋ถ ์ ๋ฐ์ดํธ, *์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ ์ง์ํด์ผ ํ ๊ฒฝ์ฐ์๋ Room์ ์ฌ์ฉํ๋ ๊ฒ ์ข๊ณ , Datastore๋ ์๊ท๋ชจ ๋จ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋๋ฐ ์ ํฉํ๋ฉฐ ์ ๋ฐ์ดํธ๋ *์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ ์ง์ํ์ง ์์ต๋๋ค.
2๏ธโฃDataStore
Jetpack Datastore๋ *ํ๋กํ ์ฝ ๋ฒํผ๋ฅผ ์ฌ์ฉํ์ฌ ํค-๊ฐ ์ ๋๋ ์ ํ์ด ์ง์ ๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ ์๋ ๋ฐ์ดํฐ ์ ์ฅ์ ์๋ฃจ์ ์ ๋๋ค. Datastore๋ Kotlin Coroutine ๋ฐ Flow๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์ ์ด๊ณ ์ผ๊ด๋ ํธ๋์ญ์ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค.
Datastore ์ ํ
Preferences Datastore : ๋ฐ์ดํฐ๋ฅผ ํค-๊ฐ ์์ผ๋ก ๊ตฌ์ฑํ์ฌ ์ ์ฅํ ์ ์๊ณ , ๋ฏธ๋ฆฌ ์ ์๋ ์คํค๋ง๊ฐ ํ์ํ์ง ์์ง๋ง *type safety๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค.
Proto Datastore : ์ฌ์ฉ์๊ฐ ์ ์ํ ๋ฐ์ดํฐ(custom data type)๋ฅผ ์ ์ฅํ๊ณ *ํ๋กํ ์ฝ ๋ฒํผ๋ฅผ ์ฌ์ฉํด ์คํค๋ง๋ฅผ ์ ์ํด์ผ ํ์ง๋ง *type safety๋ฅผ ์ ๊ณตํฉ๋๋ค.
Datastore ์ฅ์
- Proto Datastore์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ *type safety๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋น๋๊ธฐ API๋ก *Coroutine Flow๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ณ , ์ฐ๊ธฐ์ ๋ํ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก Datastore๋ ์์ ์ Dispatchers.IO์ ์ ๋ฌํด Dispatchers.IO๊ฐ ๊ด๋ฆฌํ๋ *์ค๋ ๋ํ(Thread Pool) ๋ด์ ์ค๋ ๋์ ๋ถํ ์ํฉ์ ๋ง์ถฐ ์์ ์ ๋ฐฐ๋ถํ๊ธฐ ๋๋ฌธ์ UI Thread์์ ํธ์ถํด๋ ์์ ํฉ๋๋ค.
- Error ์ ํธ๋ฅผ ๋ณด๋ผ ์ ์๊ณ , ๋ฐํ์ ์์ธ๋ก ๋ถํฐ ์์ ํฉ๋๋ค.
- ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ํธ๋์ญ์ API๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- SharedPreference๋ฅผ Datastore๋ก *migration ํ ์ ์์ด์ ์์ ์ค์ธ ํ๋ก์ ํธ์์ ๋์ฒดํ์ฌ ์ฌ์ฉํ๊ธฐ ํธ๋ฆฌํฉ๋๋ค.
์๋์ SharedPreference๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ๋ค์ ๋ณด์ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
- ์ค์ XML ํ์ผ I/O ์์ ์ ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ UI Thread์์ ์์ ํ ๊ฒฝ์ฐ ์์ ํ์ง ์๋ค.
- Runtime Exception์ผ๋ก ๋ถํฐ ์์ ํ์ง ์๋ค.
- XML ํ์ผ์ด๊ธฐ์ ์ธ๋ถ์์ ์ฝ๊ฒ ํ์ผ์ ์ฝ์ ์ ์๋ค. (Datastore๋ ๋์ผ)
- ๋น๋๊ธฐ API๋ฅผ ์ ๊ณตํ์ง๋ง Listener๋ฅผ ํตํด์๋ง ๊ฐ์ ์ฝ์ ์ ์๋ค.
- *type safety๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.
์์
ํ์ฌ ์ ๊ฐ ๊ตฌํํ๋ ค๋ ๊ฒ์ ๋ฌธ์์ด์ ์ ์ฅํ๋ ค๋ ๊ฒ์ด ๋ชฉ์ ์ด๊ธฐ ๋๋ฌธ์ Preferences DataStore๋ฅผ ์ฌ์ฉํ๋ ์์ ๋ฅผ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
1.
2.
3.
4.
5.
*์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ : ๊ธฐ๋ณธํค์ ์ธ๋ํค์ธ๋ ํค ๊ฐ์ ๊ด๊ณ๊ฐ ํญ์ ์ ์ง๋๋ ๊ฒ์ ๋ณด์ฅํฉ๋๋ค. ์ฐธ์กฐ๋๋ ํ ์ด๋ธ์ ํ์ ์ด๋ฅผ ์ฐธ์กฐํ๋ ์ธ๋ ํค๊ฐ ์กด์ฌํ๋ ํ ์ญ์ ๋ ์ ์๊ณ , ๊ธฐ๋ณธํค๋ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์์ ์ค์๋ก ๊ด๋ จ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋๊ฑฐ๋ ์์ ๋๋ ๊ฒ์ ๋ง์์ค๋๋ค.
*ํ๋กํ ์ฝ ๋ฒํผ : ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํํ๊ธฐ ์ํ Google์ ์ธ์ด์ ํ๋ซํ์ ์ค๋ฆฝ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ ๋ฉ์ปค๋์ฆ์ ๋๋ค. XML์ ์๊ฐํ ์ ์์ง๋ง ๋ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ณ ๊ฐ๋จํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐํํ๋ ๋ฐฉ๋ฒ์ ํ ๋ฒ ์ ์ํ ๋ค์, ์์ฑ๋ ํน์ ์ฝ๋๋ฅผ ์ฌ์ฉํด ๋ค์ํ ๋ฐ์ดํฐ ์คํธ๋ฆผ๊ณผ ๋ค์ํ ์ธ์ด๋ฅผ ์ฌ์ฉํด ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์ฐ๊ณ ์ฝ์ ์ ์์ต๋๋ค. ์ฝ๊ฒ ๋งํด์ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํ ํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ด๋ผ๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
*type safety : Type Check๋ฅผ ํ ์ ์์ด Runtime์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด ์๋ ์ปดํ์ผ ๋จ๊ณ์์ ๋ฌธ์ ๋ฅผ ์ก์ ์ ์๋๋ก ํด์ค๋๋ค.
*์ค๋ ๋ํ(Thread Pool) : ์์ ์ฒ๋ฆฌ์ ์ฌ์ฉ๋๋ ์ค๋ ๋๋ฅผ ์ ํ๋ ๊ฐ์๋งํผ ์ ํด๋๊ณ ์์ ํ์ ๋ค์ด์ค๋ ์์ ๋ค์ ํ๋์ฉ ์ค๋ ๋๊ฐ ๋งก์ ์ฒ๋ฆฌํ์ฌ ์์ ์ฒ๋ฆฌ ์์ฒญ์ด ํญ์ฆ๋์ด๋ ์์์ ๋งํ๋ฏ ์ค๋ ๋์ ๊ฐ์๋ฅผ ์ ํํ์ฌ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ค๋ ๋์ ์ ์ฒด ๊ฐ์๊ฐ ๋์ด๋์ง ์์ ์์คํ ์ฑ๋ฅ์ด ๊ธ๊ฒฉํ ์ ํ๋์ง ์๋๋ก ํฉ๋๋ค.
*migration : ํ ์ด์ํ๊ฒฝ์ผ๋ก ๋ถํฐ ์ข ๋ ๋ซ๋ค๊ณ ์ฌ๊ฒจ์ง๋ ๋ค๋ฅธ ์ด์ํ๊ฒฝ์ผ๋ก ์ฎ๊ฒจ๊ฐ๋ ๊ณผ์ ์ ๋งํฉ๋๋ค.
*Coroutine Flow : ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ๋ฐํ์๊ฐ ๋ฐ์ดํฐ์ ์๋น์์๊ฒ ์ง์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ(๋ฐ์ดํฐ ์คํธ๋ฆผ)ํ๋ฉฐ, Coroutine ์์์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ด๋ฒคํธ๋ฅผ ๋ฐ์์์ผ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ํด์ ์ ๋ฌํ ์ ์๋๋ก ํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ธ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ๊ธฐ ์ํ ๊ตฌ์ฑ์์์ ๋๋ค.