[Foundation] UserDefaults를 사용해서 데이터를 전달하는 방법

2021. 12. 17. 00:36Swift, iOS Foundation

iOS에서는 ViewController 간 데이터를 전달하는 방식을 크게 2가지로 나눌 수 있다.

데이터를 직접 전달하는 직접 전달(동기) 방식과,
데이터를 저장하고 필요할 때 꺼내오는 방식인 간접 전달(비동기) 방식으로 나누어진다.

오늘은 이 두 방식 중에서, 필요할 때 값을 꺼내올 수 있도록 쓸 수 있는 비동기 방식 중, UserDefaults라는 것을 사용하는 방법에 대해 공부를 해보려고 한다.

UserDefaultsiOS 프로젝트 내에 있는 데이터 저장소라고 이해하면 된다.

기본 프로젝트 폴더를 보면 info.plist라는 파일이 있는 것을 확인할 수 있는데,
UserDefaults도 plist처럼 Key-Value 형태로 값을 저장하고 꺼내올 수 있는 것이 특징이다.

UserDefaults 데이터는 기기 자체에 저장되어 있는 값이기 때문에 앱을 종료하더라도 데이터는 보존된다.

해당 특성으로 인해, 사용자 기본 설정과 같은 단일 데이터 값을 저장하는 데에는 적합하다고 볼 수 있지만,
보안상 취약하다는 문제점도 동시에 갖고 있어, 토큰값과 같은 민감한 값 대신 간단한 값을 사용하는 데에만 사용하도록 하자.

아래는 공통으로 사용할 코드이므로, 상수로 따로 분리해서 사용하기도 한다.

let defaults = UserDefaults.standard

 

1️⃣ 데이터 저장하기


UserDefaults에서는 set 메서드를 사용해서 데이터를 저장한다.

UserDefaults.standard.set(저장할 내용, forKey: 값을 저장, 연결할 Key 이름)

// 예시: 스위치값을 저장한다 했을 때
UserDefaults.standard.set(TestSwitch.isOn, forKey: "switchState")
defaults.set(TestSwitch.isOn, forKey: "switchState")  // 위에 공통 상수를 사용할 경우

 

2️⃣ 데이터 꺼내오기


값을 꺼낼 때도 저장할 때와 유사하다.

set 메서드를 사용하는 대신, 값을 가져오는 타입을 메서드처럼 직접 사용해주면 된다.
이때 원하는 값은 처음 저장할 때 사용한 forKey값을 이용해서 꺼내오게 될 것이다.

UserDefaults.standard.가져오고자 하는 형태(forKey: 값을 저장, 연결했던 Key 이름)

// 예시: 저장한 스위치값을 가져온다 했을 때
TestSwitch.isOn = UserDefaults.standard.bool(forKey: "switchState")
TestSwitch.isOn = defaults.bool(forKey: "switchState")  // 위에 공통 상수를 사용할 경우

 

3️⃣ 데이터 삭제하기


UserDefaults에 저장되어 있는 객체를 지울 때는 removeObject 메서드를 사용한다.

UserDefaults.standard.removeObject(forKey: 값을 저장, 연결할 Key 이름)

// 예시: 스위치값을 지울 때
UserDefaults.standard.removeObject(forKey: "switchState")
defaults.removeObject(forKey: "switchState")  // 위에 공통 상수를 사용할 경우

 

4️⃣ UserDefaults에 저장되어 있는 모든 객체를 보고싶을 때


UserDefaults에 저장되어 있는 모든 객체 목록은 key-value 형태로 반환할 수 있는데,
그때는 dictionaryRepresentation 메서드를 사용한다.

// 방법 #1
for (key, value) in UserDefaults.standard.dictionaryRepresentation() {
   print("\\(key) = \\(value) \\n")
 }

// 방법 #2
_ = UserDefaults.standard.dictionaryRepresentation().map {
		print("[UserDefaults_CleandUp]:\\($0.key): \\($0.value)")
}

// 방법 #3
UserDefaults.standard.dictionaryRepresentation().forEach{ 
		print("[UserDefaults_CleandUp]:\\($0.key): \\($0.value)") 
}