iOS의 pList




개요


info.plist…iOS 개발을 하다보면 굉장히 많이 보인다.

이것이 뭔지 알아보고 사용법을 익혀보겠다.




plist


pList는 프로퍼티 리스트의 줄임말로 객체 직렬화를 위한 XML파일이다.

객체 직렬화란 객체의 내용을 바이트 단위로 변환하여 파일에 기록하거나 네트워크를 통해 전달이 가능하도록 하는 것이다.

애플은 프로퍼티 리스트를 간단한 데이터 계층을 표현하기 위한 추상화라고 정의한다.

쉽게말해서 단순한 데이터를 XML 포맷에 맞추어 key value형식으로 저장하는 것이다.

plist는 앱의 공통 데이터나 주요 설정 정보를 저장하는 데에 쓰인다.

plist는 데이터의 타입을 추상화해서 저장한다. 이말은 개별적인 특성을 배제하고 공통성을 띠는 것이다.

swift의 String, Foundation의 NSString, CoreFoundation의 CFString은 모두 개별적인 특성을 가진 문자열이지만

plist의 String은 문자열이라는 공통된 특성만 가진다.

plist에 저장할 수 있는 데이터 타입은 2가지로 Primitive Data Type과 Reference Data Type이 있다.

Swift의 기본 자료형은 Primitive Data Type이고 파운데이션 프레임워크에서 제공하는 NSString과 같은 것이다.




plist의 자료형


타입 XML Swift Foundation
배열 <array> Array NSArray
딕셔너리 <dict> Dictionary NSDictionary
문자열 <string> String NSString
날짜 <date> - NSDate
Base64 - NSData
정수 <string> Int NSNumber
실수 <real> Float NSNumber
논리 <true/> Bool NSNumber




UserDefaults


iOS에 앱을 설치하면 데이터를 저장할 수 있는 영역이 생성된다.

기본 저장소는 앱이 실행되는 시점에 앱아이디.plist를 생성하여 데이터를 저장한다.

이때 iOS에서 기본 저장소를 손쉽게 다룰수 있게하는 객체가 UserDefaults이다.

UserDefaults는 런타임에 기본저장소에 접근하여 데이터를 가져오고 기록하는 역할을 한다.

UserDefaults는 싱글톤 패턴으로 설계되어있기 때문에 앱 전체에서 딱 하나의 인스턴스만 생성되고 앱전체가 사용한다.

그러면 동시성, 경쟁조건의 문제가 발생할 수 있다.

근데 UserDefaults는 먼저 들어온 요청에 우선권을 부여하여 잠금을 걸고, 해당 작업이 끝날 때까지 다음요청의 접근을 차단한다.

이것을 블로킹이라고 한다. 블로킹 알고리즘으로 인해 Thread-safe로 설계되었다.

값을 가져올 때는 type(forKey:)를, 값을 세팅할 때는 set(_:forKey:)를 이용한다.

세팅하려는 값이 nil일 때는 setNilValueForKey(_:)를 사용한다.

UserDefaults 객체는 인메모리 캐싱 매커니즘이다.

인메모리 캐싱이란 실제 저장된 위치에서 데이터를 매번 새로 읽는게 아니라 메모리에 저장해두고 재사용하는 것을 말한다.

그래서 저장소와 동기화를 해줘야하는데 이는 synchronize()를 이용한다.