본문 바로가기

스위프트

[Swift] FileManager에 대해 알아보자

프로젝트 진행중에 특정 경로에 디렉토리를 만들고, 메타 데이터 파일(대략 JSON형태)을 통해 매핑하여 위 디렉토리의 하위 디렉토리별 파일을 관리하는 기능이 필요해졌다. NSCoding을 통해 인스턴스 객체를 인코딩해서 데이터형태로 저장하거나, 저장된 데이터를 디코딩해서 다시 NSCoding 인스턴스 객체로 바꿔서 사용하는 케이스도 필요하지만, 일단 디렉토리를 생성하고 파일을 생성 및 제거하는 기능이 우선적으로 이해가 되어야 사용할 수 있으므로 Apple 프레임워크의 객체인 FileManager를 통해 위 기능을 연습해보자.


FileManager

요약 : 파일 시스템의 컨텐츠를 이용하기 위한 편리한 인터페이스의 집합이며 파일 시스템과 상호작용하기 위한 우선적인 수단입니다.

 

파일 매니저 객체는 파일 시스템의 컨텐츠를 시험해볼 수 있고 변경을 할 수 있도록 해줍니다. FileManager 클래스는 파일과 연관된 조작들에 적합한 전역 파일 매니저 객체로의 편리한 접근을 제공합니다. 파일 매니저 객체는 파일 시스템과 상호작용하는 대부분의 우선적인 모드입니다. 당신은 파일과 디렉토리들을 이동/복사/생성/위치시키는 데 파일 매니저를 사용할 수 있습니다. 또한 파일 혹은 디렉토리 혹은 해당 데이터의 속성들 및 정보를 얻을 수 있습니다.

 

파일들의 위치를 특정시킬 때, 당신은 NSURL 혹은 NSString 객체를 사용할 수 있습니다. NSURL 클래스의 사용이 파일 시스템의 아이템을 특정화시키는 데 선호되어지는데 이유는 내부적으로 경로 정보를 좀 더 효율적인 표현방식으로 변화시킬 수 있기 때문입니다. 당신은 또한 NSURL로부터 북마크를 획득할 수 있고, 북마크를 통해 파일과 디렉토리를 위치시키는 데 더 확실한 방법을 가질 수 있습니다.

 

만약당신이 파일 혹은 디렉토리를 제거하거나 연결, 복사, 이동을 한다면 당신은 이러한 동작들을 관리하는 파일 매니저 객체의 딜리게이트를 사용할 수 있습니다. 딜리게이트의 역할은 에러가 발생했을 때의 동작등을 결정할 수 있게됩니다. macOS 10.7 이상의 버전에서는 딜리게이트는 반드시 FileManagerDelegate를 채택해야합니다.

 

iOS 5.0 이상, macOS 10.7 이상에서는 파일매니저는 iCloud에 저장된 아이템들을 관리하기위한 메서드들을 포함합니다. 클라우드 저장소에 테깅된 파일과 디렉토리들은 iCloud와 동기화되서 유저의 iOS 디바이스들과 맥킨토시 컴퓨터에서 이용이 가능합니다. 아이템의 위치를 한 위치에서부터 다른위치로 이동시키는 모든 것들이 동기화가 됩니다.

 

Threading Considerations

FileManager의 전역 메서드들은 다중 스레드 환경에서 안정적입니다. 하지만, 만약 이동/복사/제거/연결등과 같은 동작에 대한 정보를 수신받기 위한 딜리게이트 사용을 한다면 당신은 파일 매니저객체의 유일한 인스턴스를 생성해야합니다. 딜리게이트의 이벤트가 정상적으로 수신되기 위해서요.


이렇게 공식문서에는 정리되어있지만, 실제로 메서드들이 어떤게 있고, 어떤 걸 사용해서 프로젝트의 목표를 달성할 수 있을지 고민해봐야 한다. 실제로 디렉토리를 만들고 파일을 생성 관리하는 API등을 알아보기전에 App의 샌드박스와 Data Container의 디렉토리등을 이해해야지 적절한 위치에 서브 파일 시스템을 만들고 관리를 할 수 있다. 먼저 위 두가지를 확인해보자.


App Sandbox

내용 자체는 거창하지만 중요한 것만 요약해서 알아보자. 샌드박스는 미국의 놀이터에 어린이들이 안전하게 뛰어놀수 있는 모래가 있는 영역을 샌드박스라고 부른다. 앱에서의 샌드박스란 앱이 맥OS의 전역시스템과 분리된 영역에서 시스템으로부터 권한을 받아서 사용을 하고 사용자 데이터를 앱 안의 영역으로 한정지어 외부로부터의 문제가 발생했을 때 시스템을 안전하게 보호하기 위함이다. 아래와 같은 사진 한장으로 요약이 가능하다.

 

Data Container

App Sanbox내 포함된 컨테이너 중, 앱 내부에서 사용하는 사용자 데이터나, 리소스 등의 파일등을 저장하는 위치가 Data Container이다. 위 그림에 세 종류의 디렉토리 말고도 iOS11부터는 System Data 디렉토리가 별도로 생겼는데, 저장할 데이터의 성격에 따라 하위 디렉토리에서 파일을 생성하고 관리할 수 있다. Data Container의 경로는 NSHomeDirectory()이다.

 

Documents 디렉토리

유저가 앱을 이용해 생성하고 관리하는 데이터들이 저장되는 위치로 적합하다. plist에 UIFileSharingEnabled 속성에 따라 iCloud에서도 접근할 수 있고, 유저가 직접 파일을 관리하여 파일 추가 및 삭제도 가능하다. 즉, 앱 내에서 가공할 데이터를 저장되는 위치이며, Temp보다도 더 앱이 삭제되지 않는 이상 영구적으로 저장을 하고 관리를 하는 속성에 알맞는 디렉토리이다. 

하위 디렉토리로 타 앱을 통해 공유를 받은 데이터가 있을 경우 하위에 "/Inbox"라는 디렉토리가 생기는 데 이 디렉토리내 파일은 삭제는 할 수 있어도 생성하거나 변경할 수는 없다. 아마 저장할 데이터가 타 앱으로부터 데이터를 공유받아서 관리가 필요할 경우 해당 디렉토리를 참조하면 될 듯 싶다.

 

Library 디렉토리

유저가 앱을 통해 가공한 데이터를 저장하는 Documents와는 다르게, 유저에게 공개되지는 않지만 앱단에서 내부적으로 필요한 데이터를 가공하여 관리할 필요가 있을 경우에 해당 디렉토리를 사용한다. 시스템에서 필요에 따라 자동으로 생성하여 사용하기도 한다.

 

Temp 디렉토리

tmp 디렉토리 속성에 따라 시스템에 의해서 언제든지 제거가 될 수 있는 디렉토리로 유저가 앱을 통해 가공이 아닌, 앱의 비즈니스 로직에 따라 임시적으로 사용할 데이터, 즉 삭제가 되어도 무방한 데이터를 저장할 때 사용하는 디렉토리이다.