iOS

[iOS] File System Basics 공식문서 번역

Kim_Baechu 2022. 9. 29. 20:09

공식문서

https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html#//apple_ref/doc/uid/TP40010672-CH2-SW2

File System Basics

파일 시스템은 데이터 파일, 앱 및 운영 체제 자체와 관련된 파일의 영구 저장을 처리합니다.

 

새 앱을 설치하는 동안 installer는 샌드박스 디렉터리 내에 앱에 대한 여러 컨테이너 디렉터리를 만듭니다.

각 컨테이너 디렉토리에는 특정 역할이 있습니다.

번들 컨테이너 디렉터리는 앱의 번들을 보관하고 데이터 컨테이너 디렉터리는 앱과 사용자 모두의 데이터를 보관합니다.

데이터 컨테이너 디렉토리는 앱이 데이터를 정렬하고 구성하는 데 사용할 수 있는 여러 하위 디렉토리로 더 분할됩니다.

또한 앱은 런타임에 iCloud 컨테이너와 같은 추가 컨테이너 디렉토리에 대한 액세스를 요청할 수 있습니다.

일반적으로 앱은 컨테이너 디렉터리 외부에서 파일에 액세스하거나 파일을 만드는 것이 금지되어 있습니다. 이 규칙의 한 가지 예외는 앱이 공용 시스템 인터페이스를 사용하여 사용자의 연락처나 음악 같은 것에 액세스하는 경우입니다.

 

Commonly used directories of an iOS app

AppName.app

앱의 번들입니다. 이 디렉터리에는 앱과 해당 리소스의 모든 리소스가 들어 있습니다.

이 디렉터리에 쓰기(Write)가 안됩니다.

변조 방지를 위해 설치 시 번들 디렉터리가 서명됩니다.

이 디렉터리에 쓰면(Write) 서명이 변경되고 앱이 실행되지 않습니다.

그러나 앱 번들에 저장된 모든 리소스에 대한 읽기 전용 액세스 권한을 얻을 수 있습니다.

자세한 내용은 *Resource Programming Guide*를 참조하십시오.

이 디렉터리의 내용은 iTunes 또는 iCloud에서 백업되지 않습니다.

그러나 iTunes는 앱 스토어에서 구입한 앱의 초기 동기화를 수행합니다.

Documents/

이 디렉토리를 사용하여 사용자 생성 콘텐츠를 저장합니다.

이 디렉토리의 내용은 파일 공유를 통해 사용자가 사용할 수 있으므로, 사용자에게 노출시킬 수 있는 파일만 포함해야 합니다.

이 디렉토리의 내용은 iTunes와 iCloud에 의해 백업됩니다.

Documents/Inbox

이 디렉토리를 사용하여 외부 엔티티가 앱을 열도록 요청한 파일에 액세스할 수 있습니다.

특히 메일 프로그램은 앱과 연결된 전자 메일 첨부 파일을 이 디렉토리에 배치합니다.

Document interaction controllers는 파일을 그 안에 배치할 수 있습니다.

이 디렉터리의 파일을 읽고 삭제할 수 있지만 새 파일을 만들거나 기존 파일에 쓸 수는 없습니다.

사용자가 이 디렉터리에서 파일을 편집하려고 하면 변경하기 전에 앱이 해당 파일을 디렉터리 밖으로 옮겨야 합니다.

이 디렉토리의 내용은 iTunes와 iCloud에 의해 백업됩니다.

Library/

사용자 데이터 파일이 아닌 파일의 최상위 디렉터리입니다.

일반적으로 여러 표준 하위 디렉터리 중 하나에 파일을 넣습니다.

iOS 앱은 일반적으로 응용 프로그램 지원 및 캐시 하위 디렉터리를 사용합니다.

그러나 사용자 지정 하위 디렉터리를 만들 수 있습니다.

사용자에게 노출하지 않을 파일에 대해 라이브러리 하위 디렉토리를 사용합니다.

앱에서 사용자 데이터 파일에 이러한 디렉터리를 사용하면 안 됩니다.

라이브러리 디렉터리의 내용(캐시 하위 디렉터리 제외)은 iTunes 및 iCloud에 의해 백업됩니다.

The Library Directory Stores App-Specific Files

tmp/

이 디렉토리를 사용하여 앱을 실행하는 동안 유지할 필요가 없는 임시 파일을 작성할 수 있습니다.

더 이상 필요하지 않은 파일은 이 디렉토리에서 제거해야 하지만, 앱이 실행되지 않을 때 시스템이 이 디렉토리를 제거할 수 있습니다.

이 디렉터리의 내용은 iTunes 또는 iCloud에서 백업되지 않습니다.

 

The Library Directory Stores App-Specific Files

라이브러리 디렉터리는 앱과 다른 코드 모듈이 사용자 지정 데이터 파일을 저장하는 곳입니다.

iOS용 코드를 쓰든 macOS용 코드를 쓰든 라이브러리 디렉토리의 구조를 이해하는 것이 중요합니다.

이 디렉토리를 사용하여 특정 상황에서 데이터 파일, 캐시, 리소스, 기본 설정 및 사용자 데이터까지 저장할 수 있습니다.

 

시스템 전체에 여러 라이브러리 디렉토리가 있지만 코드가 액세스하는 데 필요한 몇 가지 디렉토리만 있습니다.

  • Library in the current home directory — 모든 사용자별 파일을 포함하는 디렉토리이므로 가장 많이 사용하는 디렉토리 버전입니다. iOS에서 라이브러리는 앱 데이터 번들 안에 있습니다.
  • /Library (macOS only)
  • /System/Library (macOS only)

Key subdirectories of the Library directory

Application Support

사용자 문서와 관련된 파일을 제외한 모든 앱 데이터 파일을 저장하려면 이 디렉토리를 사용합니다.

예를 들어 이 디렉토리를 사용하여 앱에서 생성한 데이터 파일, 구성 파일, 템플릿 또는 앱에서 관리하는 기타 고정 또는 수정 가능한 리소스를 저장할 수 있습니다.

앱은 이 디렉토리를 사용하여 처음에 앱 번들에 포함된 수정 가능한 리소스 복사본을 저장할 수 있습니다.

게임은 사용자가 구입하고 서버에서 다운로드한 새로운 레벨을 저장하기 위해 이 디렉토리를 사용할 수 있습니다.

이 디렉터리의 모든 콘텐츠는 앱의 번들 식별자 또는 회사의 이름을 가진 사용자 지정 하위 디렉터리에 배치되어야 합니다. iOS에서 이 디렉토리의 내용은 iTunes와 iCloud에 의해 백업됩니다.

Caches

이 디렉터리를 사용하면 응용 프로그램이 쉽게 다시 만들 수 있는(re-create) 응용 프로그램별 지원 파일을 작성할 수 있습니다.

일반적으로 응용 프로그램은 이 디렉터리의 내용을 관리하고 필요에 따라 파일을 추가 및 삭제하는 역할을 합니다.

iOS 5.0 이상에서 시스템은 디스크 공간이 매우 부족한 드문 경우 캐시 디렉터리를 삭제할 수 있습니다.

앱이 실행되는 동안에는 이런 일이 발생하지 않습니다.

백업에서 복원하는 것뿐만이 아니라 다른 상황에서도 캐시 디렉토리가 지워질 수 있습니다.

Frameworks

In iOS, apps cannot install custom frameworks.

Preferences

이 디렉터리에는 앱별 기본 설정 파일이 들어 있습니다.

이 디렉터리에 직접 파일을 생성해서는 안 됩니다.

대신 NSUserDefaults 클래스 또는 CFPreferences API를 사용하여 앱에 대한 기본 설정 값을 가져오고 설정하세요. iOS에서 이 디렉토리의 내용은 iTunes와 iCloud에 의해 백업됩니다.

Files, Concurrency, and Thread Safety

파일 관련 작업은 하드 디스크와의 상호 작용을 수반하므로 다른 대부분의 작업에 비해 속도가 느리기 때문에 iOS와 macOS의 파일 관련 인터페이스 대부분은 동시성을 염두에 두고 설계되었습니다.

몇몇 기술들은 비동기적 연산을 그들의 설계에 통합하고, 다른 기술들은 디스패치 큐나 보조 스레드로부터 안전하게 실행할 수 있습니다.

Thread safety of key classes and technologies

NSFileManager

대부분의 작업에서 default NSFileManager를 여러 백그라운드 스레드에서 동시에 사용하는 것은 안전합니다.

이 규칙의 유일한 예외는 FileManager delegate와 상호 작용하는 작업입니다.

FileManager를 delegate와 함께 사용할 경우 NSFileManager 클래스의 고유한 인스턴스를 만들고 해당 인스턴스와 함께 delegate를 사용하는 것이 좋습니다.

그런 다음 한 번에 하나의 스레드에서 고유한 인스턴스를 사용해야 합니다.

Grand Central Dispatch

GCD 자체는 어떤 스레드에서든 안전하게 사용할 수 있습니다.

그러나 여전히 안전한 thread safe 방식으로 블록을 작성해야 합니다.

NSFileHandle, NSData, Cocoa streams

파일 데이터를 읽고 쓰는 데 사용하는 대부분의 Foundation objects는 단일 스레드에서 사용할 수 있지만 여러 스레드에서 동시에 사용할 수는 없습니다.

Open and Save panels

이러한 패널은 사용자 인터페이스의 일부이기 때문에 항상 앱의 메인 스레드에서 열기 및 저장 패널을 표시하고 조작해야 합니다.

POSIX routines

POSIX routines은 일반적으로 어떤 스레드에서도 안전하게 작동하도록 설계되었습니다.

NSURL and NSString

경로를 지정하는 데 사용하는 불변 객체는 모든 스레드에서 안전하게 사용할 수 있습니다.

또한 이러한 파일은 불변이므로 여러 스레드에서 동시에 참조할 수도 있습니다.

물론 이러한 개체의 변경 가능한(mutable) 버전은 한 번에 하나의 스레드에서만 사용해야 합니다.

NSEnumerator and its subclasses

Enumerator는 단일 스레드에서 안전하게 사용할 수 있지만 여러 스레드에서 동시에 사용할 수는 없습니다.