BOID
[iOS] 프로퍼티 리스트에 대해 뽀시자 - HoonIOS 본문
안녕하세요, HoonIOS입니다.
애플리케이션 안에 데이터를 저장하는 방법은 다양합니다. 프로퍼티 리스트, UserDefaults, SQLite, FMDB, CoreData 등이 있는데요.
이번 포스팅에서는 간단한 데이터를 저장할 때 편리한 프로퍼티 리스트에 대해 포스팅을 하려고 합니다. :)
프로퍼티 리스트란?
우선 기본적으로 프로퍼티 리스트는 XML 형식으로 되어있는 파일로 키 - 값 형태인 딕셔너리 형태로 저장이 됩니다.
plist파일이라고 부르기도 하는데 애플에서는 프로퍼티 리스트를 간단한 데이터 계층을 표현하기 위한 추상화라고 정의를 하고 있습니다.
plist파일 많이 보셨죠?
이렇게 앱을 만들면 자동으로 생성되는 파일로 Info.plist가 있습니다.
해당 파일 안에는 앱의 공통 데이터나 주요 설정 정보를 저장하는 데 많이 사용이 되기도 합니다.
예를 들어서 마지막으로 열었던 문서, 파일, 애플리케이션 이름 등 다양한 정보를 저장하는데 사용이 됩니다.
프로퍼티 리스트는 딕셔너리 방식으로 되어 있어 서로 다른 키를 사용해서 여러 데이터를 저장할 수 있지만 같은 키를 사용하여 데이터를 저장하면 기존에 저장했던 데이터가 지워지고 새로운 데이터가 올라가는 불상사가 일어나게 됩니다....
따라서 키를 이용하여 값을 저장할 때는 조심하게 사용을 해야 합니다.
프로퍼티에 저장되는 Type
프로퍼티 리스트는 데이터 타입을 추상해서 저장을 합니다. 음.... 유추해서 저장한다고 봐야 맞는 거 같습니다. :)
예를 들어서, 각 타입의 문자열 데이터가 프로퍼티 리스트에 저장할 때에는 모두 String타입으로 저장이 되어 string타입이지만 스위프트의 string타입 하고는 다릅니다.
응? 무슨 말이죠? string 타입이지만 string과 다르다니 ㅠㅠ
즉 다시 말해서 string타입으로 저장을 했지만. character라든가 NSString의. length속성을 사용할 수 없다는 말입니다. :)
프로퍼티 리스트가 객체를 저장하는 과정에서 각 구체적은 타입을 배재하고 문자열 특성만 추출했기 때문에 string타입이지만 스위프트의 string 하고 다른 그런 타입이 됩니다.
이렇게 string타입에 바로 안 넣고 추상적으로 저장하는 이유는 읽어 들일 때 어느 타입으로도 읽을 수 있게 해 주기 위해서입니다. String으로 저장을 했어도 다양한 String관련 타입인 NSString, String, CGString으로 읽을 수 있습니다.
간단한 사진을 통해 설명해보겠습니다.
string을 프로퍼티 리스트에 저장할 때 추상적인 string으로 저장되고 이것을 읽고 사용을 할 때 다양한 타입으로 변환해서 사용할 수 있습니다.
여기서 중요한 것을 데이터 타입을 추상화하는 것이지 안에 있는 데이터를 추상화한다는 말이 압니다. 데이터를 추상화하면 데이터가 변형되는 대참사가 일어납니다.....😳😳
프로퍼티 리스트에 저장할 수 있는 데이터 타입과 XML형태
프로퍼티 리스트에 저장할 수 있는 타입은 크게 세 가지가 있습니다.
- 원시 타입
- 스위프트에서 기본적으로 제공하는 타입으로는 Int, String, Float, Double 등이 있습니다.
음 그냥 다른언에서도 기본적으로 제공하는 타입이라고 생각하시면 될꺼같습니다. - 레퍼런스 타입
- NSString, NSDate, CFString, CFDate, NSNumber 등 파운데이션에 해당하는 부분이 속한다고 보시면 될 거 같습니다. - 집합 자료형
- Array, Dictionary, NSArray, NSDictionary 등이 있습니다.
- 기본적인 컬랙션 타입이라고 생각을 하시면 될 거 같습니다.
- 집합 자료형 안에 집합 자료형을 담을 수 있습니다. 예를 들어 array안에 array, Dictionary안에 Dictionary같이 담을 수 있습니다.
프로퍼티 리스트는 XML 포맷으로 되어 있다고 말씀을 드렸는데 만약 XML 포맷을 처음 접해보시는 분이라면 한번 XML방식을 읽고 오시는 것이 좋습니다.
프로퍼티 리스트에 데이터를 저장할 때는 <> 안에 각 데이터 타입을 명시하는 XML문법을 적용해야 합니다.
예를 들어서,
string을 저장하려면 <string> int를 저장하려면 <integer> 배열은 <array>로 논리형은 <true/><false/>로 표시해주면 됩니다.
이렇게 프로퍼티 리스트에 저장할 수 있는 데이터 타입들을 공통적으로 프로퍼티 객체 타입이라고 합니다. 즉, 프로퍼티 객체 타입이 아니라면 프로퍼티 리스트에 저장을 할 수 없습니다.
※ 참고
프로퍼티 객체 타입에 속하지 않아도 프로퍼티 리스트에 저장할 수 있는 방법이 있다고 합니다.
메커니즘을 직접 구현해줄 경우 데이터를 저장할 수 있기 때문에 NSCorder프로토콜인 변환 메커니즘을 통해 구현을 해주면 됩니다.
프로퍼티 리스트는 기본적으로 키와 기반으로 하는 데이터이기 때문에 최상위 노드에는 반드시 <dict>로 시작을 해야 합니다.
그렇지만 딕셔너리는 항목들이 순서대로 저장되는 게 아니므로 만약 프로퍼티 리스트 안에 순서가 필요하다고 하시면 Array를 이용하면 됩니다. :)
키는 항상 문자열로 되어 있으므로 <key> </key> 형태로 표시해주면 됩니다. 또 값들은 데이터 타입에 맞게 <string></string> <integer> </integer> <array></array> </true>등으로 표시를 해주면 됩니다. :)
형태를 그냥 말로만 설명하면 좀 어려울 수 있으니 한번 프로퍼티 리스트를 작성해보겠습니다.
프로퍼티 리스트 작성하기
간단하지만 프로퍼티 리스트를 한번 작성해보겠습니다. :)
1. 새 파일인 property list파일을 추가해줍니다.
그다음 파일 이름을 적어주시면 됩니다. 저는 여기서 test로 부여했습니다.
2. 생성하고 생성한 plist를 보면 비어있는 것을 볼 수 있습니다.
Root만 있는데요 Root는 최상위 노드로 개념상에만 존재하지 실제 XML 파일로 가보면 존재하지 않습니다.
여기서 위의 XML 파일을 소스코드로 보는 법은 프로젝트에서 해당 plist에 마우스 우클릭하고 Open As -> SourceCode로 이동을 해주면 됩니다.
다시 원래 Propery List로 보고 싶으면 Open As -> Property List로 이동하면 됩니다.
3. 이제 해당 프로퍼티 리스트에 아래와 같은 프로퍼티 리스트 데이터들을 넣어주겠습니다.
Key | Value |
이름 | HoonIOS |
국적 | 한국 |
사는곳 | 경기도 |
나이 | 28 |
취미 | Array(야구보기, 오버워치) |
4. 우선 제일 먼저 Root오른쪽에 있는 +버튼을 클릭해줍니다.
Root는 최상위 노드이기 때문에 그 위로 노드 추가를 해줄까 없습니다.
5. 그럼 아래와 같은 노드가 나옵니다.
6. 키 타입 값을 순서대로 작성을 해주면 됩니다.
* 설명
- 위쪽 사진을 보면은 하나의 노드에 순서대로 키 타입 값이 들어가지 있어 원하는 것을 넣어주면 됩니다.
7. 한번 이름부터 나이까지 작성해보겠습니다.
* 설명
- 나이 값이 Integer이 아니지만 number가 정수형 값을 나타냅니다.
그러나 Source Code로 해서 보시면 이와 같이 integer타입으로 나오는 것을 확인할 수 있습니다.
8. 이게 끝이 아니죠! 취미의 값들을 array형태로 되어 있습니다. 한번 작성해보겠습니다.
* 설명
- 이렇게 취미를 설정하고 type을 Array로 하면 해당 타입은 배열이 되는데요 Array로 맞춰주면 맨 왼쪽에 >가 추가되는 것이 보이시나요?
이렇게 Array, Dictionary로 바꾸고 싶다면 type을 변경해주시면 됩니다.
9. 그다음 >를 눌러주면 아래로 가리키는 V로 바뀌는 것을 확인할 수 있습니다.
10. 이제 이 상태에서 +버튼을 눌러주어 두 개의 취미를 설정해주겠습니다.
* 설명
- +를 누를 때마다 Item 0, item 1이 나오는 것을 확인할 수 있습니다. 또 이때 먼저 추가된 노드가 아래로 내려가고 새로 추가된 노드가 그 위에 올라가게 됩니다.
- 만약 V로 열려있는 상태가 아니라 >로 닫혀있는 상태면 해당 상태에 +를 눌러 추가하려고 해도 해당 노드의 자식 노드로 추가하는 게 아니라 옆에 새로운 노드로 추가되는 것이므로 주의해야 합니다.
11. 짠 이제 다했습니다. 한번 소스코드로 어떻게 되어 있는지 확인해보겠습니다.
각 타입이 잘 들어간 것을 확인할 수 있고 array에 값들이 들어간 것을 확인할 수 있습니다.
이렇게 등록된 프로퍼티 리스트들은 앱스토어에 등록할 때 배포 파일인. ipa파일로 반입되었다가 사용자가 앱을 설치할 때 같이 설치가 됩니다. 이런 프로퍼티 리스트가 설치되는 것을 앱 번들이라고 합니다.
이렇게 간단하게 프로퍼티 리스트를 알아봤는데요 다음 포스팅에는 앱 내부에 기본 저장소를 통해 저장하는 UserDefaults에 대해 포스팅하겠습니다. :)
'IOS 시작기' 카테고리의 다른 글
[iOS] UIPickerView구현하기 & ToolBar추가 - HoonIOS (0) | 2021.05.30 |
---|---|
[iOS] 피커뷰 뽀개기 - HoonIOS (0) | 2021.05.29 |
[iOS] 내비게이션 바 커스터마이징 하기 (0) | 2021.05.25 |
[iOS] 커스텀 버튼 구현하기(스토리보드형, 코드형) - HoonIOS (2) | 2021.05.21 |
[iOS] 스토리보드 없이 커스텀으로만 탭바 뷰컨트롤러 구현하기 - HoonIOS (0) | 2021.05.20 |