UserDefaults
class UserDefaults: NSObject
Swift
๋ณต์ฌ
์ฑ์ ์คํํ๋ ๋์ ์ง์์ ์ผ๋ก ํค-๊ฐ ์์ ์ ์ฅํ๋ ์ฌ์ฉ์์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ธํฐํ์ด์ค์ด๋ค.
ย UserDefaults ๋ ๋ฐํ์ ํ๊ฒฝ์์ ๋์ํ๊ณ , ์ฑ์ด ์คํ๋๋ ๋์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํด key-value ์ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ๊ฑฐ๋ ๊ฐ์ ธ์จ๋ค.
๊ทธ๋ผ UserDefaults๋ ์ด๋์ ์ ์ฅ๋ ๊น?
UserDefaults๋ ์ด๋์ ์ ์ฅ๋ ๊น?
์ฐ๋ฆฌ๊ฐ iOS์ ์ฑ์ ์ค์นํ๋ฉด ์ฑ์ด ์คํ๋๋ ์์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์์ฑ๋๋ค.
๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ Property List๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, .plist ํ์ผ์ xml ํ์์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ธ plist ํ์ผ์ด SandBox๋ด์ Bundle Container์ ์ ์ฅ๋๋ค.
plist ํ์ผ์ด SandBox ๋ด์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์, ์ฑ์ ๊บผ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋๋ฉฐ ์ฑ์ ์ญ์ ํ ๊ฒฝ์ฐ์๋ง ํด๋น ํ์ผ์ ์ ์ฅํ ๋ฐ์ดํฐ๊ฐ ์ ๊ฑฐ๋๋ค.
๋๋ฌธ์ UserDefaults๋ฅผ ์ฌ์ฉํ ๋๋ ๋์ฉ๋์ ๋ฐ์ดํฐ๋ ์ฌ์ฉ์ ์ ๋ณด ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋๋ณด๋ค๋
์๋ ๋ก๊ทธ์ธ ์ฌ๋ถ, ์์ด๋ ์ ์ฅ, ์๋ฆผ ์ค์ ์ฌ๋ถ ๋ฑ๊ณผ ๊ฐ์ ๋จ์ผ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๋ก ์ ์ฅํ๋ค.
ย macOS์ UserDefaults ์ดํด๋ณด๊ธฐ
/Users/์ฌ์ฉ์์ด๋ฆ/Library/Preferences/
Shell
๋ณต์ฌ
์ฌ๊ธฐ์ ๋ค์ด๊ฐ๋ฉด ์ฌ๋ฌ plist ํ์ผ์ ๋ฐ๊ฒฌํ ์ ์๋ค.
ํ์ผ์ ๋ณด๋ฉด UserDefaults๋ฅผ ํตํด ์ ์ฅ๋ ๋ฐ์ดํฐ ๋ฟ๋ง ์๋๋ผ, ์ธํฐํ์ด์ค ๋น๋ ๋ฑ์์ ์ฌ์ฉํ๋ AutoSave ํญ๋ชฉ ๋ฑ ์ฑ์ ์ ๋ณด ๋ํ ์ ์ฅ๋์ด ์๋ ๊ฒ์ ์ ์ ์๋ค.
ย iOS์ UserDefaults ์ดํด๋ณด๊ธฐ
iOS์ ๊ฒฝ์ฐ, xcode๋ฅผ ํ์ฉํ์ฌ ํ์ธํ ์ ์๋ค.
1.
๋จผ์ ์์ดํฐ๊ณผ ๋งฅ ๊ธฐ๊ธฐ๋ฅผ ์ฐ๊ฒฐํ๋ค.
2.
xcode๋ฅผ ์คํํ๊ณ ๋ค์ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ค.
a.
Window > Devices and Simulators
b.
Devices ํญ์ ๋ณด๋ฉด ์ฐ๊ฒฐํ ๊ธฐ๊ธฐ์ ์ด๋ฆ์ด ๋ํ๋๋ค.
3.
plist ํ์ผ์ด ๋ณด๊ณ ์ถ์ ์ฑ์ ์ ํํ ๋ค, ์ฐ๋์ ์์ด์ฝ์ ๋๋ฅด๊ณ Download Container๋ฅผ ํด๋ฆญํ๋ค.
4.
์ดํ, ๋ค์ด๋ก๋ํ xcappdata ํ์ผ์ ์ฐํด๋ฆญํด ํจํค์ง ๋ด์ฉ ๋ณด๊ธฐ๋ฅผ ํด๋ฆญํ๋ค.
a.
Appdata > Library > Preferences
5.
์ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ฉด plist ํ์ผ์ ํ์ธํ ์ ์๋ค.
ย UserDefaults.standard
์ฑ๊ธํค ์ธ์คํด์ค๋ก, ๊ณต์ ๋ ๊ธฐ๋ณธ ๊ฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค.
let defaults = UserDefualts.stand
Swift
๋ณต์ฌ
ย ๋ฐ์ดํฐ ์ ์ฅํ๊ธฐ
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋๋ set ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
defaults.set("value", forkey: "key")
Swift
๋ณต์ฌ
์ด๋, key ๊ฐ์ ํญ์ String ์ด์ด์ผ ํ๋ค.
String ์ธ์๋ Float, Int, Bool, URL ๋ฑ์ ํ์
์ ์ ์ฅํ ์ ์๋ค.
์ฐธ๊ณ ๋ก nil ๊ฐ์ ์ ์ฅํ๋ฉด ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ง์ฐ๋ ๊ฒ๊ณผ ๋์ผํ ํจ๊ณผ์ด๋ค. ํ์์๋ค๋ฉด nil์ ๋ฃ์ผ๋ฉด ๋๋ค.
ย ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
์ ์ฅํ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด์ฌ ๋๋ ํ์
์ ๋ง๊ฒ ๊ฐ์ ธ์์ผ ํ๋ค.
let data1 = defaults.objects(forkey: "key") as! String
let data2 = defaults.string(forkey: "key")
Swift
๋ณต์ฌ
ํ์
์ ์ ๊ฒฝ์ฐ์ง ์๊ณ ๊บผ๋ธ ๋ค, ์ฌ๋ฐ๋ฅธ ํ์
์ผ๋ก ํ์
์บ์คํ
์ ํด์ฃผ๊ฑฐ๋, ํ์
์ ๋ง๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
ย ์ ์ฒด ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋์ด ์๋ ๋ชจ๋ key-value ์์ ๊ฐ์ ธ์ฌ ๋๋ dictionaryRepresentation() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
let defaults = UserDefaults.standard
for (key, value) in defaults.dictionaryRepresentation() {
print("\\(key): \\(value)")
}
_ = defaults.dictionaryRepresentation().map {
print("\\($0.key): \\($0.value)")
}
defaults.dictionaryRepresentations().forEach {
print("\\($0.key): \\($0.value)")
}
Swift
๋ณต์ฌ
dictionaryRepresentation() ๋ฉ์๋๋ง ์ฌ์ฉํ๊ณ for๋ฌธ์ด๋, map์ด๋ ๋ถ๋ฌ์ค๋ ํ์์ ์๊ธฐ ๋ง์์ด๋ค.
๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์ ๋ชจ๋ key ๋๋ value๋ง ๋ณด๊ณ ์ถ์ ๋๋ ์ด๋ ๊ฒ
defaults.dictionaryRepresentation().keys
defaults.dictionaryRepresentation().values
Swift
๋ณต์ฌ
ย ์ฌ์ฉ์ ์ ์ ํ์ ์ ์ฅํ๊ธฐ
๊ตฌ์กฐ์ฒด๋ ํด๋์ค์ ์ธ์คํด์ค ๋ฑ ์ฌ์ฉ์ ์ ์ ํ์
์ ๊ฒฝ์ฐ๋ค๋ ์ง์ ๋ฐ๊พธ์ด์ผ ํ๋ค.
ย ๊ทธ๋ฅ ์ ์ฅํ๋ค๋ฉด
UserDefaults๋ Dataํ์ ๋ฐ๋ฅด๋๋ฐ, ์ด Data ํ์
์ Base64 ์ธ์ฝ๋ฉ ํ์์ ๋ฐ๋ฅธ๋ค.
์ฆ, ์ ์ฅํ ๊ฐ์ฒด๋ ๋ชจ๋ Base64 ์ธ์ฝ๋ฉ์ ๊ฑฐ์ณ์ผ ํ๋ค.
๊ธฐ๋ณธ ํ์
์ธ Int, String ๋ฑ์ UserDefaults๋ฅผ ์ฌ์ฉํ ๋ ๋ด๋ถ์ ์ผ๋ก ์ ์ฉ๋์ง๋ง, ๊ตฌ์กฐ์ฒด ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ง์ ๋ณํํด์ผ ํ๋ค.
ย JSONEncoder / Decoder
JSONEncoder / Decoder๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด๋ฅผ ์ ์ฅ ๊ฐ๋ฅํ ๋ฐ์ด๋๋ฆฌ ํ์
์ผ๋ก ์ธ์ฝ๋ฉ / ๋์ฝ๋ฉํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
๋จผ์ ๊ตฌ์กฐ์ฒด๋ฅผ Codable ๋ก ์ ์ธํ๋ค.
struct Diary: Codable {
var uuid: String
var title: String
var contents: String
}
Swift
๋ณต์ฌ
๋ฐ์ดํฐ๋ฅผ ๋ฃ์ ๋ค, JSONEncoder() ๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
let diary = Diary(uuid: "uuid", title: "title", contents: "contents")
let defaults = Userdefaults.standard
let encoder = JSONEncoder()
if let encodedData = try? encoder.encode(diary) {
defaults.set(encodedData, forkey: "diary")
}
Swift
๋ณต์ฌ
๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ๋๋ JSONDecoder() ๋ฅผ ์ฌ์ฉํ๋ค.
let decoder = JSONDecoder()
if let data = defaults.object(forkey: "diary") as? Diary {
if let decodedData = try? decoder.decode(Diary.self, from: data) {
print(decodedData)
}
}
Swift
๋ณต์ฌ