[ios] File System (1)
안녕하세요. 저는 하나의 프로젝트를 만들면서 온라인에서 mp3파일을 어플리케이션 내에 다운로드 받아 오프라인에서도 재생이 되게끔 구현해야 했습니다. 이를 위해 어플리케이션 내 특정 디렉토리에 저장을 해야하는데 이를 보다 자세히 이해하기 위해 파일 시스템에 관해 공부를 하였고 공부한 것을 기록하고자 이렇게 글로 남기게 되었습니다.
공부를 한 것을 기록하는 것으로 몇몇의 글을 번역한 부분이 있습니다.
iOS Standard Directories: Where Files Reside
보안의 목적으로 하나의 iOS 어플리케이션은 자신이 속한 샌드박스안의 디렉토리들만을 접근할 수 있습니다. 새로운 어플리케이션이 디바이스 내에 설치되는 동안 인스톨러는 해당 어플리케이션의 샌드박스 내에 여러 컨테이너 디렉토리를 생성합니다. 각각의 컨테이너는 각자의 역할이 존재합니다.
Bundle Container : Bundle 컨테이너는 어플리케이션의 번들을 담고 있습니다.
- Bundle이란 : 파일 시스템의 하나의 디렉토리로 실행가능한 코드와 이와 연관된 사진, 소리 nib 파일 등의 자원들을 한 곳에 같이 묶어놓은 것입니다. Bundle은 단순히 파일의 위치를 이동시킴으로써 어플리케이션이나 소프트웨어의 일부분을 설치하거나 이전하는데 편리함을 제공합니다. 또한 어플리케이션을 국제화하는데 중요한 요소입니다. (참고 : About Bundles)
Data Container : Data 컨테이너는 어플리케이션과 사용자를 위한 Data를 담고있습니다. 그리고 Data 컨테이너는 몇개의 서브디렉토리를 갖고 있습니다.
일반적으로 하나의 어플리케이션은 컨테이너 디렉토리 바깥에 있는 파일에 접근하거나 그곳에 파일을 생성할 수 없습니다. 하지만 언제나 예외는 있듯이 사용자의 연락처, 음악 등의 Public system interface에 접근할 때는 예외로 합니다.
Commonly used directories of an iOS app
AppName.app
: 앱의 이름.app의 형식으로 앱의 번들입니다. 이 디렉토리는 해당 앱과 이에 필요한 모든 자원들을 포함합니다. 개발자는 이 디렉토리에 쓰기 행위를 할 수 없습니다. 임의의 조작을 방지하기 위해 앱이 설치되는 동안 이 디렉토리는 signed됩니다. 하지만 해당 앱 번들 내에는 read-only의 권한으로는 접근할 수 있습니다. 이 디렉토리의 내용은 iCloud나 iTunes에 백업되지 않습니다.Documents/
: 앱의 사용자에게 보여주어야 하는 파일들과 앱의 사용자로부터 생성된 데이터들을 저장할 때 이 디렉토리에 저장합니다. 이러한 파일들은 앱의 사용자가 생성하거나 지우거나 수정할 수 있습니다. 그림을 그리는 어플을 예를 들자면 위에서 언급된 데이터들로는 사용자가 그린 그림에 해당하는 파일이나 사용자가 인터넷에서 받아온 그림 파일들에 해당할 수 있습니다. 앱의 사용자가 보고 듣기 위해 다운로드 받은 비디오나 오디오 파일도 이 디렉토리에 저장되어야 합니다.Documents/
디렉토리의 데이터들은 iCloud나 iTunes에 백업됩니다.Library/
: 사용자의 파일을 제외한 파일들이 저장되고 그들의 최상위 디렉토리입니다. iOS 앱은 보통Application Support
와Caches
디렉토리를 사용하지만 개발자가 임의로 서브디렉토리를 생성할 수 있습니다. 사용자에게 노출되지 않았으면 하는 파일들을 이곳에 위치시킵니다. 또한UserDefaults
와 같은Preferences
에 해당하는 데이터들도 이곳에 저장됩니다.Caches
파일을 제외하고 iCloud나 iTunes에 백업됩니다.tmp/
: 앱이 실행되는 동안 생성되거나 사용되는 일시적인 파일들을 저장하는 디렉토리입니다. 해당 파일이 더이상 필요 없다고 판단되면 앱이 해당 파일을 삭제합니다. 또한 앱이 실행되고 있지 않으면 역시 시스템은 이 디렉토리를 깨끗이 청소합니다. iCloud와 iTunes에 백업되지 않습니다.
간단히 정리하자면 read-write가 가능한 디렉토리는 Documents
와 tmp
뿐입니다. 추가적으로 iCloud 역시 간단히 설명하자면 iCloud는 로컬 저장 시스템을 완전히 대체하는 것이 아니라 이를 확장하는 개념으로 사용됩니다.
마무리
위의 내용을 토대로 저는 다운받아야할 mp3 파일을 Documents/
디렉토리안에 저장해야한다는 것을 배웠습니다. 하지만 이를 코드로 표현하려면 몇가지를 더 공부했어야 했습니다. 기초적인 iOS의 파일시스템에 대한 이론은 여기까지로 하고 다음 포스팅에서는 본격적으로 코드를 작성해보는 시간을 갖도록 하겠습니다. 감사합니다.
참고자료