Open Hsungjin opened 5 months ago
App๋ด์์ ํน์ ๊ฐ๋ค์ ์ฑ์ด ๊บผ์ง์ํ์์๋ ์ ์ฅํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ๋ ๊น์?
Userdefaults์ @AppStorage๋ฅผ ์ฌ์ฉํด์ ์ ์ฅํ๋ฉด ๋ฉ๋๋ค.
Userdefaults๋ ๊ธฐ์กด UIkit์์ ๋ง์ด ์ฌ์ฉํ๋ ๋ฐฉ์์ด๊ณ AppStorage๋ SwiftUI์์ iOS 14๋ถํฐ ์๋ก์๊ธด ๋ด์ฉ ์ ๋๋ค.
์ด๋ฒ์๋ ๋๊ฐ์ ๊ฐ๋ ์ ๋ํด ์ค๋ช ํ๊ณ ๋๊ฐ์ ์ฐจ์ด์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
Apple์์๋ "App์ ์คํํ๋ ๋์ ์ง์์ ์ผ๋ก key-value๋ก ์ ์ฅํ๋ ์ฌ์ฉ์์ ๊ธฐ๋ณธ Database์ ๋ํ Interface"๋ผ๊ณ ํด์.
์ฝ๊ฒ ๋งํด ๋ณ๋์ DB ์์ด App์ ๋ด๊ฐ ์ํ๋ ๊ฐ์ ์ด๋ค Key์ ํจ๊ป ์ ์ฅํ๊ณ , ์ธ์ ๋ ๊ทธ Key๋ฅผ ํตํด ๊ฐ์ ๋ถ๋ฌ๋ผ ์ ์๋ ๊ฒ์ด์ฃ .ย
๋จ, 512KB ์ดํ์ ๊ฐ๋จํ String, Bool, Int, Array ๋ฑ ๋จ์ผ Data๋ฅผ ์ ์ฅํ๋ ๋ฐ์ ์ ํฉํ๊ธฐ ๋๋ฌธ์ ๋๋์ Data๋ฅผ ์ ์ฅํ๊ณ ์ถ๋ค๋ฉด ๋ฐ๋ก Database๋ฅผ ๋ง๋๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค!
๋ค์๊ณผ ๊ฐ์ด ๋ฒํผ์ ํตํด ์นด์ดํฐ๋ฅผ ์ฆ๊ฐํ๋ ์ฑ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณผ๊ฒ์
struct ContentView: View { @State private var count: Int = 0 var body: some View { VStack { Text("clicked count: \(count)") Button("click") { count += 1 } } } }
์์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ํด๋ฆญ ํ์๊ฐ ํ๋ฉด์ ํ์๋๊ฒ ๋ฉ๋๋ค.
๊ทผ๋ฐ ์ ์ฝ๋์์์๋ ์ฑ์ ์ข ๋ฃํฌ๋ค๊ฐ ๋ค์ ํค๋ฉด ์นด์ดํธ๊ฐ 0์ด ๋์ด๋ฒ๋ฆฌ๊ฒ ์ฃ ?
๊ทธ๊ฒ์ UserDefaults๋ฅผ ์ด์ฉํด์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
struct ContentView: View { @State private var count = UserDefaults.standard.integer(forKey: "Clicked") var body: some View { VStack { Text("์ด ์นด์ดํธ : \(count)") Button("์นด์ดํธ ์ฆ๊ฐ") { count += 1 UserDefaults.standard.set(count, forKey: "Clicked") } } } }
๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ ํ๋ฉด ์ฑ์ ์ข ๋ฃํ๋ค๊ฐ ๋ค์ ์คํ์ ์์ผ๋ count๋ผ๋ ๋ณ์๊ฐ UserDefaults์ ํค ๊ฐ์ ํตํด ๊ฐ์ ๋ฐ์์ค๊ธฐ ๋๋ฌธ์ ์ ์ฅ๋ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด์๋ UserDefaults.standerd.set(๊ฐ, forkey: "ํค๊ฐ") ์ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
UserDefaults.standerd.set(๊ฐ, forkey: "ํค๊ฐ")
UserDefault.standard.set(0, forkey: "number") //Integer ํ์ ๋ฐ์ดํฐ ์ ์ฅ UserDefault.standard.set(false, forkey: "boolean") //Boolean ํ์ ๋ฐ์ดํฐ ์ ์ฅ UserDefault.standard.set("Hi", forkey: "string") //String ํ์ ๋ฐ์ดํฐ ์ ์ฅ
๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ์ํด์๋ UserDefaults.standerd.์๋ฃํ(key: "ํค๊ฐ") ์ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
UserDefaults.standerd.์๋ฃํ(key: "ํค๊ฐ")
let string = UserDefault.standard.string(key: "string") ?? "" let number = UserDefault.standard.integer(key: "number") let boolean = UserDefault.standard.bool(key: "boolean")
๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ๋ ์ฒ์ ๊ฐ์ด ์ ์ฅ๋์ด ์์ง ์์ผ๋ฉด Int์ Float, Double ํ์ ์ 0์, Bool ํ์ ์ false๋ฅผ ๋ฐํํ๋ค.
String ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ๋ ์ฃผ์ํ ์ ์ ์ฒ์ ๊ฐ์ด ์ ์ฅ๋์ด ์์ง ์์ผ๋ฉด nil์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ optional binding์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด์๋ UserDefaults ์ธ์คํด์ค์ removeObject ๋ฉ์๋๋ฅผ ์ฌ์ฉ ์ญ์ ํ๋ค.
UserDefault.standard.removeObject(forKey:"numebr")
์ ๋ UserDefaults๋ฅผ ์ข๋ ์ฝ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํด์ Extension์ ํตํด ๊ด๋ฆฌ ํฉ๋๋ค.
๋ฏธ๋ฆฌ set, get์ ๋ํด ์ ์๋ฅผ ํด๋๊ณ ๋ฐ๋ก ํธ์ถํด์ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ค์ด ๋์ต๋๋ค.
extension UserDefaults { private static let isNoti = "notiKey" func setUserNoti(_ noti: String) { set(noti, forKey: UserDefaults.isNoti) } func getUserNoti() -> String? { return string(forKey: UserDefaults.isNoti) } }
์์ ์ฝ๋๋ ์ ๊ฐ ์ค์ฌ๋ก ์ฌ์ฉํ๋ ์์ ์ ๋๋ค.
set๊ณผ get์ ๋ํด์ ๋ฏธ๋ฆฌ ์ ์ ๋์ด ์์ฃ ?
์ด๋ ๊ฒ ์์ฃผ ์ฌ์ฉ๋ ๊ฐ๋ค์ ๋ฏธ๋ฆฌ ์ ์ํด๋๊ณ ์ฌ์ฉํ๋ฉด ๊ฐ๋ ์ฑ๋ ์ฌ๋ผ๊ฐ๊ณ ์ข์๊ฒ ๊ฐ์ต๋๋ค.
Userdefaults์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ญํ ์ ๋์ผํฉ๋๋ค.
์ฌ์ฉ์ฑ์์ ํฌ๊ฒ ์ฐจ์ด๊ฐ ์๊ณ , ํ์๋ทฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ค ์ ์์ต๋๋ค.
์์ ํ๋ก์ ํธ ์์์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด
@State private var count = UserDefaults.standard.integer(forKey: "cliked")
๋ญ๊ฐ ์ฝ๋๊ฐ ๊ธธ์ด ๋ณด์ด์ง ์๋์?
์ด๊ฒ์ ๋ํด ํด๊ฒฐํ๊ธฐ ์ํด iOS 14๋ฒ์ ์ด์ ๋ถํฐ @State ์์ฑ์ ํฌํจํ์ฌ ๋ฐ์ดํฐ ์ ์ฅ๊น์ง ํ๋ฒ์ ํ ์ ์๋ property wrapper ๊ฐ ๋์์ต๋๋ค.
๊ทธ๊ฒ ๋ฐ๋ก @AppStorage ์ ๋๋ค.
import SwiftUI struct ContentView: View { @AppStorage("cliked") private var count = 0 var body: some View { VStack { Text("clicked count: \(count)") Button("click") { count += 1 } } } }
๊ทธ๋์ ๊ฒฐ๋ก ์ ์ผ๋ก๋
"๋ค"
@AppStorage๋ SwiftUI์ ์ผ๋ถ๋ก์ ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์ UIKit์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. @AppStorage๋ SwiftUI์ ๋ทฐ ๋ชจ๋ธ๊ณผ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ์์คํ ์ ํตํฉ๋์ด ์์ด, SwiftUI ๋ด์์ ๋ฐ์ดํฐ์ ์ ์ฅ ๋ฐ ์ ๋ฐ์ดํธ๊ฐ ๋ทฐ์ ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ์ ์๊ฒ ๋์ต๋๋ค.
Intro
App๋ด์์ ํน์ ๊ฐ๋ค์ ์ฑ์ด ๊บผ์ง์ํ์์๋ ์ ์ฅํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ๋ ๊น์?
Userdefaults์ @AppStorage๋ฅผ ์ฌ์ฉํด์ ์ ์ฅํ๋ฉด ๋ฉ๋๋ค.
Userdefaults๋ ๊ธฐ์กด UIkit์์ ๋ง์ด ์ฌ์ฉํ๋ ๋ฐฉ์์ด๊ณ AppStorage๋ SwiftUI์์ iOS 14๋ถํฐ ์๋ก์๊ธด ๋ด์ฉ ์ ๋๋ค.
์ด๋ฒ์๋ ๋๊ฐ์ ๊ฐ๋ ์ ๋ํด ์ค๋ช ํ๊ณ ๋๊ฐ์ ์ฐจ์ด์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
What is UserDefaults
Apple์์๋ "App์ ์คํํ๋ ๋์ ์ง์์ ์ผ๋ก key-value๋ก ์ ์ฅํ๋ ์ฌ์ฉ์์ ๊ธฐ๋ณธ Database์ ๋ํ Interface"๋ผ๊ณ ํด์.
์ฝ๊ฒ ๋งํด ๋ณ๋์ DB ์์ด App์ ๋ด๊ฐ ์ํ๋ ๊ฐ์ ์ด๋ค Key์ ํจ๊ป ์ ์ฅํ๊ณ , ์ธ์ ๋ ๊ทธ Key๋ฅผ ํตํด ๊ฐ์ ๋ถ๋ฌ๋ผ ์ ์๋ ๊ฒ์ด์ฃ .ย
๋จ, 512KB ์ดํ์ ๊ฐ๋จํ String, Bool, Int, Array ๋ฑ ๋จ์ผ Data๋ฅผ ์ ์ฅํ๋ ๋ฐ์ ์ ํฉํ๊ธฐ ๋๋ฌธ์ ๋๋์ Data๋ฅผ ์ ์ฅํ๊ณ ์ถ๋ค๋ฉด ๋ฐ๋ก Database๋ฅผ ๋ง๋๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค!
๊ฐ๋จ ์นด์ดํฐ ์์
๋ค์๊ณผ ๊ฐ์ด ๋ฒํผ์ ํตํด ์นด์ดํฐ๋ฅผ ์ฆ๊ฐํ๋ ์ฑ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณผ๊ฒ์
์์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ํด๋ฆญ ํ์๊ฐ ํ๋ฉด์ ํ์๋๊ฒ ๋ฉ๋๋ค.
๊ทผ๋ฐ ์ ์ฝ๋์์์๋ ์ฑ์ ์ข ๋ฃํฌ๋ค๊ฐ ๋ค์ ํค๋ฉด ์นด์ดํธ๊ฐ 0์ด ๋์ด๋ฒ๋ฆฌ๊ฒ ์ฃ ?
๊ทธ๊ฒ์ UserDefaults๋ฅผ ์ด์ฉํด์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ ํ๋ฉด ์ฑ์ ์ข ๋ฃํ๋ค๊ฐ ๋ค์ ์คํ์ ์์ผ๋ count๋ผ๋ ๋ณ์๊ฐ UserDefaults์ ํค ๊ฐ์ ํตํด ๊ฐ์ ๋ฐ์์ค๊ธฐ ๋๋ฌธ์ ์ ์ฅ๋ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ค๋ฉด?
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด์๋
UserDefaults.standerd.set(๊ฐ, forkey: "ํค๊ฐ")
์ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ค๋ฉด?
๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ์ํด์๋
UserDefaults.standerd.์๋ฃํ(key: "ํค๊ฐ")
์ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ๋ ์ฒ์ ๊ฐ์ด ์ ์ฅ๋์ด ์์ง ์์ผ๋ฉด Int์ Float, Double ํ์ ์ 0์, Bool ํ์ ์ false๋ฅผ ๋ฐํํ๋ค.
String ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ๋ ์ฃผ์ํ ์ ์ ์ฒ์ ๊ฐ์ด ์ ์ฅ๋์ด ์์ง ์์ผ๋ฉด nil์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ optional binding์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค.
๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ค๋ฉด?
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด์๋ UserDefaults ์ธ์คํด์ค์ removeObject ๋ฉ์๋๋ฅผ ์ฌ์ฉ ์ญ์ ํ๋ค.
UserDefaults๋ฅผ ์ข๋ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์์๊น?
์ ๋ UserDefaults๋ฅผ ์ข๋ ์ฝ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํด์ Extension์ ํตํด ๊ด๋ฆฌ ํฉ๋๋ค.
๋ฏธ๋ฆฌ set, get์ ๋ํด ์ ์๋ฅผ ํด๋๊ณ ๋ฐ๋ก ํธ์ถํด์ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ค์ด ๋์ต๋๋ค.
์์ ์ฝ๋๋ ์ ๊ฐ ์ค์ฌ๋ก ์ฌ์ฉํ๋ ์์ ์ ๋๋ค.
set๊ณผ get์ ๋ํด์ ๋ฏธ๋ฆฌ ์ ์ ๋์ด ์์ฃ ?
์ด๋ ๊ฒ ์์ฃผ ์ฌ์ฉ๋ ๊ฐ๋ค์ ๋ฏธ๋ฆฌ ์ ์ํด๋๊ณ ์ฌ์ฉํ๋ฉด ๊ฐ๋ ์ฑ๋ ์ฌ๋ผ๊ฐ๊ณ ์ข์๊ฒ ๊ฐ์ต๋๋ค.
What is @AppStorage
Userdefaults์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ญํ ์ ๋์ผํฉ๋๋ค.
์ฌ์ฉ์ฑ์์ ํฌ๊ฒ ์ฐจ์ด๊ฐ ์๊ณ , ํ์๋ทฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ค ์ ์์ต๋๋ค.
์์ ํ๋ก์ ํธ ์์์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด
๋ญ๊ฐ ์ฝ๋๊ฐ ๊ธธ์ด ๋ณด์ด์ง ์๋์?
์ด๊ฒ์ ๋ํด ํด๊ฒฐํ๊ธฐ ์ํด iOS 14๋ฒ์ ์ด์ ๋ถํฐ @State ์์ฑ์ ํฌํจํ์ฌ ๋ฐ์ดํฐ ์ ์ฅ๊น์ง ํ๋ฒ์ ํ ์ ์๋ property wrapper ๊ฐ ๋์์ต๋๋ค.
๊ทธ๊ฒ ๋ฐ๋ก @AppStorage ์ ๋๋ค.
๊ทธ๋์ ์ด๋ค์ํฉ์ ์ด๋ค๊ฑธ ์ฌ์ฉํ ๊น?
UserDefaults์ ์ฃผ์ ์ฌ์ฉ ์์
@AppStorage์ ์ฃผ์ ์ฌ์ฉ ์์
๊ทธ๋์ ๊ฒฐ๋ก ์ ์ผ๋ก๋
UIKit์์ @AppStorage๋ฅผ ๋ชป์ธ๊น?
"๋ค"
@AppStorage๋ SwiftUI์ ์ผ๋ถ๋ก์ ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์ UIKit์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. @AppStorage๋ SwiftUI์ ๋ทฐ ๋ชจ๋ธ๊ณผ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ์์คํ ์ ํตํฉ๋์ด ์์ด, SwiftUI ๋ด์์ ๋ฐ์ดํฐ์ ์ ์ฅ ๋ฐ ์ ๋ฐ์ดํธ๊ฐ ๋ทฐ์ ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ์ ์๊ฒ ๋์ต๋๋ค.