itunes API간단하게 활용해서 SearchAPP을 만들어보는 과정에서 검색 기록을 저장하기 위한 솔루션으로 userDefaults라는 것에 대해서 알아보게 되었다.
IOS에서 앱이 독립적으로 실행되면서 다른앱이나 시스템에 영향을 주지않도록 격리된채로 실행되게 해주는 보안솔루션이라고 한다.
다른 블로그에서도 강조하던데, 이게 공격을 막는 방법이 아니라, 피해를 최소화하는 솔루션이라고 생각하시면 될 것 같다.
다시 한 번 정리하자면, 보안을 위해서 앱이 설치될 때마다 운영 체제에서 각각의 앱에 대한 SANDBOX를 생성하고, ios앱과 상호작용하는 건 SANDBOX내의 디렉토리로 제한한다.
Q : 샌드박스내 디렉토리에만 접근한다며! 그러면 내 사진첩에서 업로드하는 경우에는 내 사진첩에 접근하잖아, 여기는 샌드박스 내의 디렉토리가 아닐텐데?
A : 그럴때는 시스템 권한을 받고, 그 권한 범위 내에서 시스템 자원에 접근하게 되는 것이다. 어플을 사용할 때 아래 사진과 같은 권한설정이 시스템 권한을 여쭙는 것이다. 일반적으로 샌드박스 내로 제한되기 때문에, 접근하고자 할때는 사용자에게 권한을 묻는 것이다.
대표적인 권한이 필요한것들 예시
USB, 카메라,마이크,인쇄,블루투스,주소록,위치정보,캘린더,파일 액세스
예시 사진처럼 줌과 인스타그램이 각각 다른 샌드박스라고 이해하시면 좀 더 쉽다.
각각 다른 sandbox를 독립되게 구성하고 있기 때문에 ZOOM에서 권한을 다 풀더라도, INSAGRAM에서는 새롭게 또 권한을 묻는 것이다.
SANDBOX는 크게 3개의 덩어리로 볼 수 있다.
1. Bundle Container
2. Data Container
3. iCloud Container
번들 컨테이너 (Bundle Container)
앱의 실행파일, 리소스 등 포함
읽기 전용이며, 설치 시 암호화 서명됨 (변조나 무단 접근을 방지)
수정 시 앱 실행 불가하다.
번들 컨테이너를 수정하면 앱 서명이 깨지기 때문에 실행이 정상적으로 불가능할 것이다.(수정은 탈옥했을때 수정이 가능해지는 경우가 있다고 한다.)
데이터 컨테이너 (Data Container)
주요 하위 디렉토리
1. Documents: 사용자 생성 문서 및 파일 콘텐츠 저장, iTunes와 iCloud 백업 가능
2. Library: 사용자 데이터가 아닌 파일 저장(앱의 설정 파일이나 캐시 데이터 등,,)
3. tmp: 임시 파일 저장, 앱 종료 시 삭제 권장
앱을 시작할 때마다 키-값 쌍을 지속적으로 저장하는 사용자 기본 데이터베이스에 대한 인터페이스입니다.
사용예시 - 최근 검색기록 저장
private var RecentSearchLists: [String] { UserDefaults.standard.value(forKey: "recentSearchList") as? [String] ?? [] } func registSearchLists(term: String) { var currentSearchLists = RecentSearchLists currentSearchLists.append(term) UserDefaults.standard.set(currentSearchLists, forKey: "recentSearchList") }
이런식으로 standard
, 즉 기본설정을 의미한다고 보시면된다. 이전에 URLSession.shared
를 썼던 것과 비슷한 개념으로 느껴졌다. 이것도 기본설정을 활용할 때 사용되었었던 것처럼 큰 변수가 없다면, standard를 사용해주면 되는 것 같다. 거기에 이제 set으로 key값과 함께 등록을 해주면 사용할 수가 있다. 불러올때는 value로 불러와서 활용해줄 수 있다.
Q: 그럼 userDefaults의 유효기한은 ?
- 별도로 정해져 있지 않다. LocalStorage처럼 앱이 삭제되거나, 사용자가 직접 삭제하지 않는한 유지된다.
Q: 그럼 기한을 생성할때 별도로 정해줄 순 있나?
- 유효기한이 별도로 정해져 있지 않아서, 직접 타이머나 날짜같은 데이터들을 활용해서 정리를 해줘야한다.
Q: 그럼 삭제 방법??
A :
UserDefaults.standard.removeObject(forKey: "exampleKey")
해당 함수로 키 값을 주면 해당 데이터가 삭제 된다. 전체 삭제하는 방법은 반복문 돌려야하고, 키 안에서 몇개의 값만 삭제해주려면 그 값을 받은다음에, 내가 새롭게 초기화해서 이를 .set해주어서 덮어씌우는 방법이 있다.// 기존에 저장된 데이터 let initialArray = ["apple", "banana", "cherry"] UserDefaults.standard.set(initialArray, forKey: "exampleKey") // 특정 값만 삭제 (banana삭제) if var storedArray = UserDefaults.standard.array(forKey: "exampleKey") as? [String] { storedArray.removeAll { $0 == "banana" } UserDefaults.standard.set(storedArray, forKey: "exampleKey") }
Q:그럼 용량은 어느정도 인거지? 막 저장해도 괜찮은건가??
userDefaults용량에 관한 토의1
userDefaults용량에 관한 토의2
확실하게 정해지진 않았지만, KB대에서 해결을 보는게 좋다고 한다! 이론상으로는 제한이 없고, 기기의 가용공간만큼도 저장은 할 수 있다고 하지만, 불가능하고, 1MB미만으로 해결보는 것이 좋다고 한다. 때문에 이미지 같은 것을 저장하고 싶다면은 UserDefaults에 이미지를 저장하는게 아니라, 클라우드 스토리지와 같은 형태로 저장하는것이 좋다고 하며, 대용량은 FileManager를 사용하라고 한다.
SANDBOX에 데이터 저장하는 방식엔 UserDefaults뿐만이 아니라, 사용목적에 따라Core Data, FileManager, Keychain 등 여러가지가 있는데 일단 오늘은 UserDefaults와 FileManager에 대해서만 간단히 다루고 다음 포스팅에서 이 4가지를 비교하면 좋을 것 같다.
let data = Data("Large data".utf8)
let url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("largeData.txt")
try? data.write(to: url)
파일 쓰기
let data = "Hello, FileManager!".data(using: .utf8)! try? data.write(to: fileURL)
파일 읽기
if let data = try? Data(contentsOf: fileURL), let content = String(data: data, encoding: .utf8) { print(content) // "Hello, FileManager!" }
파일 삭제
try? FileManager.default.removeItem(at: fileURL)
폴더 생성
let folderURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("MyFolder") try? FileManager.default.createDirectory(at: folderURL, withIntermediateDirectories: true)
특징 | UserDefaults | FileManager |
---|---|---|
저장 위치 | 앱 샌드박스의 Library/Preferences 폴더 (자동 관리) | 앱 샌드박스의 다양한 폴더 (Documents, Caches 등) |
저장 데이터 | 간단한 키-값 쌍 데이터 | 파일, 이미지, 대규모 JSON 등 복잡한 데이터 |
데이터 크기 제한 | 약 1~2MB 정도 (작은 설정 데이터에 적합) | 크기 제한 없음 (디스크 공간 허용 범위 내에서 가능) |
사용 목적 | 환경설정, 작은 데이터 저장 | 파일 저장, 읽기, 삭제, 복잡한 데이터 관리 |
보안 | 앱 샌드박스 내 보관, 탈옥된 기기에서 접근 가능 | 앱 샌드박스 내 보관, 디렉토리별 보안 설정 가능 |
데이터 영구성 | 기본적으로 앱 삭제 시 함께 삭제 | 폴더에 따라 데이터가 유지되거나 삭제될 수 있음 |
새로운 운영체제, 구조, 언어 등 여러가지가 겹쳐서 모든게 좀 새로운 영역이라서 공부하는게 좀 오래걸리는 느낌인데, 나중에는 익숙해지겠지 싶다.