@AppStorage , UserDefaults의 특징

오늘은 AppStorage를 처음 사용해보면서 이전에 알고 있었고 사용했었던 UserDefaults와의 차이 및 특징에 대해서 알아보려고 한다.

 

먼저 UserDefaults는 이전에 UIKit에서 부터 자주 사용하던 개념이기 때문에 먼저 정리하고 넘어가보자!

UserDefaults는 iOS에서 데이터를 영구적으로 저장하고 읽어오는데 가장 흔하고 쉽게 사용된다.

 

큰 데이터를 저장할 순 없고 주로 간단한 설정의 저장값 혹은 사용자의 로그인 정보 정도의 값을 저장하는데 쉽게 구현할 수 있기 때문에 자주 사용되었다.

 

UserDefaults는 주로 Bool, String, Int , Double, Date, Array, Dictionary 등 저장이 가능하고 이 UserDefaults에 데이터를 저장하게 되면 iOS 앱 샌드박스 내 위치한 파일에 데이터가 저장된다. 그렇기 때문에 저장된 데이터는 앱이 재시작 되거나 재부팅되어도 유지된다.

 

// 값 저장
UserDefaults.standard.set(true, forKey: "isLoggedIn")

// 값 읽기
let isLoggedIn = UserDefaults.standard.bool(forKey: "isLoggedIn")

로그인이 된 상태 등을 저장하기 위해 이렇게 Key:Value 값을 통해 bool 값을 저장하고 이 저장된 bool 값을 활용해 로그인이 된 상태와 안된 상태를 별도로 구현할 수 있게 된다.

 

https://developer.apple.com/documentation/swiftui/appstorage/

그렇다면 이제 이번에 새로 사용해본 @AppStorage에 대해서 알아보자.

 

@AppStorage는 SwiftUI에서 도입된 속성 래퍼이다. 이 래퍼는 유저디폴츠를 더욱 간편하게 사용할 수 있도록 감싸는 형태로 제공하고 SwiftUI의 view와 자동으로 바인딩이 된다. @AppStorage를 사용하면 유저디폴츠의 값이 view 상태에 따라 저장된 값이 업데이트 될 수 있다는 뜻이다.

 

즉 구현되는 로직을 비교해보자면 @State의 래퍼를 사용한 것과 비슷하다고 할 수 있다. 스테이트 래퍼를 사용해 감싼 값은 값이 변하는 것을 추적하고 추적한 값을 업데이트하는 역할이기 때문에 쉽게 생각하면 유저디폴츠를 감싸 더욱 쉽고 편리하게 사용할 수 있게 해준다고 생각하면 된다.

 

@AppStorage("isLoggedIn") var isLoggedIn: Bool = false

// 뷰에서 사용
if isLoggedIn {
    Text("로그인 상태")
} else {
    Text("로그아웃 상태")
}

이렇게 꼭 유저디폴츠를 감싸지 않고 변수만 담아 변경되는 값을 유저디폴츠 처럼 저장하는 것도 가능하다.

 

원래 프로퍼티를 생성하는 과정에 앞에 @AppStorage를 붙이고 그냥 Key값만 넣어주면 아주 쉽게 구현이 가능하다는 점이 장점이었다.

 

실제로 사용했을때 너무 쉽고 간단해서 이전에 유저디폴츠도 쉬웠지만 더 쉽게 사용가능하며 기능도 확대된 느낌이었기 때문에 아주 좋은 경험이었다.

 

결론적으로 유저디폴츠와 앱스토리지는 같은 유저디폴츠 기반으로 동작하지만 사용 환경 및 목적에 따라 선택이 가능하다.

 

SwiftUI에서 상태와 뷰에서의 간단한 바인딩을 원한다면 앱스토리지만을 활용하는것이 효율적이고 앱 전역에서 값을 저장하고 불러와 사용하려면 유저디폴츠가 아주 좋다.

 

오늘은 두 기능의 차이점을 알아보았다!!