Swift + iOS/iOS

[ios] File System (1)

군옥수수수 2018. 3. 27. 14:10

[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 SupportCaches 디렉토리를 사용하지만 개발자가 임의로 서브디렉토리를 생성할 수 있습니다. 사용자에게 노출되지 않았으면 하는 파일들을 이곳에 위치시킵니다. 또한 UserDefaults와 같은 Preferences에 해당하는 데이터들도 이곳에 저장됩니다. Caches 파일을 제외하고 iCloud나 iTunes에 백업됩니다.
  • tmp/ : 앱이 실행되는 동안 생성되거나 사용되는 일시적인 파일들을 저장하는 디렉토리입니다. 해당 파일이 더이상 필요 없다고 판단되면 앱이 해당 파일을 삭제합니다. 또한 앱이 실행되고 있지 않으면 역시 시스템은 이 디렉토리를 깨끗이 청소합니다. iCloud와 iTunes에 백업되지 않습니다.

간단히 정리하자면 read-write가 가능한 디렉토리는 Documentstmp 뿐입니다. 추가적으로 iCloud 역시 간단히 설명하자면 iCloud는 로컬 저장 시스템을 완전히 대체하는 것이 아니라 이를 확장하는 개념으로 사용됩니다.


마무리

위의 내용을 토대로 저는 다운받아야할 mp3 파일을 Documents/ 디렉토리안에 저장해야한다는 것을 배웠습니다. 하지만 이를 코드로 표현하려면 몇가지를 더 공부했어야 했습니다. 기초적인 iOS의 파일시스템에 대한 이론은 여기까지로 하고 다음 포스팅에서는 본격적으로 코드를 작성해보는 시간을 갖도록 하겠습니다. 감사합니다.


참고자료

  1. File System Basics
  2. About Files and Directories
  3. Ever wonder about iOS Application files and folder structure once installed on device?
  4. Where you should put your iOS App files for faster device backup performance?
  5. Working with Directories in Swift on iOS 10