프로퍼티 리스트
1. 개요
프로퍼티 리스트(Property List, plist)는 다양한 방식으로 구현될 수 있는 데이터 표현 방식이다. NeXTSTEP에서 처음 사용되었으며, GNUstep과 macOS 프레임워크에서도 여러 형식이 도입되었다. 주로 환경 설정, 객체 저장 등에 사용되며, 텍스트(ASCII, XML), 이진 파일 등 여러 파일 형식을 지원한다. macOS에서는 plutil 유틸리티를 통해 구문 검사, 형식 변환, 편집이 가능하며, AppleScript 인터페이스를 통해 접근할 수도 있다. Windows, 크로스 플랫폼 환경에서도 plist 파일을 활용할 수 있으며, 다양한 프로그래밍 언어에서 plist 파일을 읽고 쓰는 기능을 제공한다.
| 종류 | 파일 포맷 |
|---|---|
| 확장자 | .plist |
| MIME 형식 | application/x-plist |
| 개발 | 애플 컴퓨터, 그누스텝, 과거 NeXT |
| 종류 | 연관 배열 객체 직렬화 |
-
GNUstep -
오브젝티브-C
오브젝티브-C는 C 언어를 기반으로 스몰토크의 객체 지향 기능을 결합하여 개발된 프로그래밍 언어이며, 애플의 macOS와 iOS 개발 환경에서 핵심 언어로 사용되었다. -
GNUstep -
번들 (macOS)
macOS에서 번들은 응용 프로그램, 프레임워크, 플러그인 등 다양한 형태로 존재하며 실행에 필요한 코드, 리소스, 설정 파일 등을 포함하는 특수한 디렉터리 형식이다. -
마크업 언어 -
HTML
HTML은 웹 페이지 제작을 위한 표준 마크업 언어로서, 팀 버너스리가 제안하고 구현한 후 인터넷 발전과 함께 널리 사용되며, SGML에 기반하여 하이퍼텍스트 기능으로 다양한 콘텐츠를 표현하고 연결하며, W3C와 WHATWG에서 표준화를 진행하고 최신 버전은 HTML Living Standard이다. -
마크업 언어 -
XAML
XAML은 마이크로소프트에서 개발한 XML 기반의 마크업 언어로, 사용자 인터페이스, 데이터 바인딩, 이벤트 처리 등을 정의하며 WPF, Silverlight, WF, WinRT API 앱, Xamarin.Forms 등에서 UI 개발에 널리 사용된다. -
MacOS -
메일 (애플)
메일은 애플에서 개발한 이메일 클라이언트로, macOS에 통합되어 다양한 기능과 인터페이스 변화를 거쳤으며, iCloud 동기화, 이메일 추적 차단, 이메일 전송 취소, 예약 발송 등을 지원한다. -
MacOS -
개러지밴드
애플이 개발한 개러지밴드는 로직 프로 기술을 기반으로 한 음악 제작 소프트웨어로, 가상 악기, MIDI 편집 기능, 팟캐스트 제작, 악기 레슨 등 다양한 기능을 제공하며 macOS와 iOS에서 아마추어부터 전문가까지 폭넓게 사용된다.
2. 표현 방법
프로퍼티 리스트는 데이터를 추상적으로 표현하며, 구체적인 파일 형식은 여러 방식으로 구현될 수 있다. NeXTSTEP에서는 한 가지 형식을 사용했는데, GNUstep과 OS X 프레임워크에서는 다양한 형식을 도입했다.
2.1. NeXTSTEP
NeXTSTEP에서 프로퍼티 리스트는 사람이 읽고 수정하기 쉽도록 프로그래밍 언어 문법과 유사한 ASCII 형식으로 설계되었다.
문자열은 다음과 같이 표현한다.
"plist 문자열"
바이너리 데이터는 다음과 같이 표현한다.
<
배열(Array)는 다음과 같이 표현한다.
( "1", "2", "3" )
딕셔너리(Dictionary) 배열은 다음과 같이 표현한다.
{
"key" = "value";
...
}
NeXTSTEP의 프로퍼티 리스트는 NSValue(숫자, 불린 자료형 등) 객체 표현에 제한이 있었다.
2.2. GNUstep
GNUstep은 NeXTSTEP 형식을 기반으로 몇 가지 추가적인 데이터 형식을 지원한다.
* 숫자, 불리언 자료형 등을 포함하는 NSValue
* NSDate (<*DYYYY-MM-DD HH:MM:SS timezone> 형식으로 작성)
GNUstep의 프로퍼티 리스트는 macOS에서 읽고 쓸 수 있다. 또한, GNUstep은 자체 바이너리 형식인 NSPropertyListGNUstepBinaryFormat영어을 지원한다.
GNUstep은 plist 명령줄 도구를 제공하며, 여기에는 pl 및 defaults 버전이 포함된다.
2.3. macOS
macOS는 NeXTSTEP 형식을 읽을 수 있지만, 애플은 XML 기반 형식과 바이너리 형식, 이렇게 두 가지 새로운 형식을 선호한다.
Mac OS X 10.0에서는 NeXTSTEP 형식이 폐지되었고, 애플에서 공개한 DTD를 갖는 새로운 XML 형식이 도입되었다. XML 형식은 비ASCII 문자를 지원하며, GNUstep의 ASCII 프로퍼티 리스트 형식과 달리, Apple의 ASCII 프로퍼티 리스트 형식이 지원하지 않는 NSValue 객체를 저장할 수 있다.
하지만 XML 파일은 공간 효율적인 저장 방식이 아니기 때문에, Mac OS X v10.2에서는 프로퍼티 리스트 파일을 바이너리 파일로 저장하는 새로운 형식이 도입되었다. Mac OS X v10.4부터는 환경설정 파일의 기본 형식이 되었다.
XML 프로퍼티 리스트에 사용되는 Foundation 클래스와, CoreFoundation 형식, XML 태그 및 데이터 저장 형식은 다음과 같다.
| Foundation 클래스 | CoreFoundation 형식 | XML 태그 | 형식 |
|---|---|---|---|
| NSString | CFString | <string> | UTF-8 인코딩 문자열 |
| NSNumber | CFNumber | <real>, <integer> | 10 진수 문자열 |
| NSNumber | CFBoolean | <true /> 또는 <false /> | 두 종류의 태그 |
| NSDate | CFDate | <date> | ISO 8601 형식 문자열 |
| NSData | CFData | <data> | Base64 인코딩 데이터 |
| NSArray | CFArray | <array> | child element 번호 |
| NSDictionary | CFDictionary | <dict> | <key> 태그와 plist element 관련 태그 |
프로퍼티 리스트는 plutil 유틸리티를 사용하여 구문 확인, 형식 변환에 사용할 수 있다. 또한, NeXTSTEP의 기본 유틸리티를 사용하여 환경설정 값을 저장하고 관리할 수 있다.
2.3.1. macOS에서의 도구
`plutil` 유틸리티(Mac OS X 10.2에서 도입)는 프로퍼티 리스트의 구문을 확인하거나 프로퍼티 리스트 파일을 다른 형식(XML, 바이너리, JSON)으로 변환하는 데 사용할 수 있다.
`defaults` 명령어는 커맨드 라인에서 환경설정 값을 읽고 쓰는 데 사용된다.
`/usr/libexec/PlistBuddy` 명령어는 대화형 프로퍼티 리스트 편집기를 제공하며, 스크립트 작성도 가능하다.
Xcode는 내장된 프로퍼티 리스트 편집기를 통해 바이너리 및 XML 형식의 프로퍼티 리스트를 시각적으로 편집할 수 있게 해준다.
Mac OS X 10.4부터는 시스템 이벤트 응용 프로그램을 통해 프로퍼티 리스트 파일을 읽기 위한 AppleScript 인터페이스를 제공한다. Mac OS X 10.5에서는 프로퍼티 리스트의 생성, 작성, 편집을 위한 AppleScript 인터페이스를 제공한다.
3. 다른 플랫폼
XML 및 JSON 프로퍼티 리스트는 모든 텍스트 편집기에서 수동으로 편집할 수 있다. 애플은 이진 또는 XML 형식의 plist는 Xcode에서 계층적 뷰어/편집기로 편집할 수 있도록 지원하지만, JSON 형식은 처리할 수 없다. Mac OS X 10.4부터 System Events 응용 프로그램을 통해 프로퍼티 리스트 파일을 읽을 수 있는 AppleScript 인터페이스를 제공하며, Mac OS X 10.5부터는 파일을 편집, 생성 및 쓸 수 있는 인터페이스도 제공한다.
XML 형식의 태그, 관련 Foundation 클래스 및 CoreFoundation 유형, 데이터 저장 형식은 다음과 같다.
| Foundation 클래스 | CoreFoundation 유형 | XML 태그 | 저장 형식 |
|---|---|---|---|
| UTF-8 인코딩 문자열 | |||
| 십진수 문자열; 실수는 지수를 가질 수 있으며, 무한대(inf) 또는 NaN(nan)일 수 있다. | |||
| 데이터 없음 (태그만) | |||
| ISO 8601 형식 문자열 | |||
| Base64 인코딩된 데이터 | |||
| 자식 요소의 수에 제한이 없습니다. 비어 있을 수 있다. | |||
| 태그와 plist 요소 태그가 번갈아 나타납니다. 비어 있을 수 있다. |
이진 파일 형식은 애플의 Foundation 라이브러리에서 이진 plist의 오픈 소스 구현에 대한 Core Foundation C 코드 소스 파일()의 주석 블록에 문서화되어 있다. 애플은 plist(5) 매뉴얼 페이지 문서에서 구현을 불투명하다고 설명하며, 이는 해당 형식에 의존하는 것을 권장하지 않음을 의미한다.
이진 파일은 XML이나 JSON 형식으로는 캡처할 수 없는 정보를 저장할 수 있다. 예를 들어, 이진 plist는 별도의 배열과 사전이 파일에 직렬화되어 모두 동일한 데이터 요소를 저장하고 있다는 사실을 캡처할 수 있지만, XML 파일에서는 불가능하다. 또한, 이진 파일에는 직렬화될 때 데이터 항목을 식별하는 데 사용되는 UID 유형이 있다.
이진 plist 객체 형식 (CoreFoundation 1153 기준)은 다음과 같다.
객체 테이블 다음에는 두 테이블의 크기와 위치에 대한 정보를 포함하는 트레일러가 뒤따른다.
2006년에 도입되어 NetBSD#4.0 (2007)에서 처음 출시된 proplib 라이브러리는 커널과 유저랜드 간의 데이터 직렬화에 사용될 수 있다. 이 라이브러리는 XML plist 언어의 일부를 구현한다. 2010년에는 NetBSD의 proplib 라이브러리가 DragonFly로 포팅되었으며, DragonFly BSD#2.8부터 사용할 수 있다.
3.1. Windows
plist 파일은 iOS 및 macOS를 포함하여 애플 또는 Darwin 시스템에서 가장 잘 알려져 있지만, iTunes 또는 Safari와 같은 애플 소프트웨어가 설치된 경우 Windows 컴퓨터에도 존재한다. Windows에서 해당 파일은 일반적으로 바이너리 파일이지만, 일부 응용 프로그램은 다른 형식으로 PLIST 파일을 생성할 수 있다.
Windows에서 애플 plist 파일은 사용자 홈 디렉터리에 저장된다. Windows의 이러한 plist 파일은 일반적으로 윈도우 레지스트리를 사용하는 대신 환경 설정 및 기타 정보를 저장한다.
Windows에서 PLIST 파일을 편집하는 옵션은 macOS만큼 광범위하지 않다. 파일이 XML 또는 JSON 형식인 경우 Notepad++과 같은 텍스트 편집기를 주의해서 사용할 수 있다. 애플은 "Apple Application Support" 패키지 (iTunes의 일부) 내에 plutil.exe를 제공하며, 이는 macOS의 해당 프로그램과 동일하다.
3.2. 크로스 플랫폼
* NetBSD#4.0(2007)에서 처음 출시된 proplib 라이브러리는 2006년에 도입되었으며, 커널과 유저랜드 간의 데이터 직렬화에 사용될 수 있다. 이 라이브러리는 XML plist 언어의 일부를 구현한다. 2010년에는 NetBSD의 proplib 라이브러리가 DragonFly로 포팅되었으며, DragonFly BSD#2.8부터 사용할 수 있다.
* 페이스북의 오픈 소스 형태의 Xcode 빌드 도구 재구현인 xcbuild는 plist 라이브러리를 포함하고 있다. 이러한 크로스 플랫폼 유틸리티는 C++(C++)로 작성되었다.
* 파이썬 프로그래밍 언어는 plist 파일을 읽고 쓰기 위한 내장 plistlib 모듈을 가지고 있으며, Apple의 XML 또는 바이너리 형식(Python 3.4 이후)을 지원한다. ProperTree는 이 라이브러리를 사용하는 크로스 플랫폼 편집기이다. ccl-bplist라는 타사 라이브러리는 NSKeyedArchiver UID를 처리하는 추가 기능을 가지고 있다.
* Go는 네 가지 유형의 plist를 지원하는 plist 패키지를 가지고 있다: OpenStep 텍스트, GNUStep 텍스트, Apple XML 및 Apple 바이너리. 또한 XML 및 바이너리 형식의 UID를 처리한다.
* Dart는 propertylistserialization이라는 타사 라이브러리를 가지고 있으며, NSKeyedArchiver UID도 처리한다.
4. 예제
xml
```
Dictionary 안에 '냉장고' 키를 가진 element의 0번 인덱스에 '코끼리' 문자열 element를 가진 array를 표현하는 방법이다. (Mac OS X 10.6 작성)
4.0.1. 냉장고 안에 코끼리 넣기 (Mac OS X 10.6 작성)
xml
```
Dictionary 안에 '냉장고' 키를 가진 element의 0번 인덱스에 '코끼리' 문자열 element를 가진 array를 표현하는 방법이다.