Search
Duplicate

UserDefaults

Created
2023/09/28 06:54
Tags
UserDefaults

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
๋ณต์‚ฌ

ย Reference