디렉터리의 중요성
앱에 로컬 데이터를 활용하려면 로컬 데이터의 특성에 맞게 저장되는 디렉터리를 정해주어야 한다. 안드로이드 앱같은 경우 이 점을 지키지 않아도 앱 심사가 거부되는 등의 문제가 발생하지 않지만, IOS 앱은 문제가 발생한다.
예를 들어 앱에서 활용하는 유저의 정보 파일을 TMP 디렉터리 ( 임시 파일 디렉터리 )에 저장하여 사용하고 있다면 데이터가 삭제될 위험도 있고 IOS 같은 경우 iCloud 백업 기능을 사용할 수 없다.
이 글에서는 IOS 앱이 사용하는 디렉터리의 구조와 목적을 알아보고, 추가적으로 path_provider 패키지를 사용해서 아주 쉽게 경로를 얻는 방법을 알아보도록 한다.
IOS 앱의 구조
모든 IOS 앱은 샌드박스(SandBox)라는 자신만의 공간을 갖는다. 샌드박스는 폐쇄적인 공간이여서 외부에서 함부로 침범할 수 없다. 마찬가지로 다른 앱의 샌드박스도 침범할 수 없다. (IOS가 보안이 뛰어난 이유이다.)
물론 유저의 허락 아래에 외부의 침범을 허용할 때도 있는데, 유저의 허락 아래에 위치 정보를 사용할 수도 있고, 갤러리 사진을 이용할 수도 있다.(앱을 처음 사용할 때 물어보는 그것이다.)
어쨌든, 앱 개발자는 앱에서 사용되는 데이터를 기기에 저장해야 할 필요가 생길 수 있는데 위에서 말했듯이 샌드박스 밖을 벗어날 수 없기 때문에 내부 특정 디렉터리에 저장해야 한다.
샌드박스는 별거 없이 그냥 디렉터리일 뿐이다. 내부에는 앱에 필요한 데이터들이 각각 디렉터리에 나뉘어 보관되고 있다. 그러면 우리가 저장할 로컬 데이터는 어떤 디렉터리에 저장해야 하는 지 알아보자.
어떤 디렉터리를 선택할까?
만약 앱 개발자가 데이터를 저장하려면 선택할 수 있는 디렉터리는 4종류가 있다.
- /Documents
- /Library/Application Support
- /Library/Caches
- /tmp
각각 정해진 목적이 다 정해져 있으니 잘 알고 사용해야 한다.(그렇지 않으면 출시 후에 문제가 생길 수 있다.)
Documents 디렉터리
해석하면 문서 폴더이다. Documents 디렉터리에는 유저가 생성한 파일, 다운로드한 파일같은 것을 저장해주는 디렉터리이다. 쉽게 생각하자면 하드디스크같은 느낌. 저장소 역할이기 때문에 당연히 이 디렉터리는 iCloud로 백업이 된다.
이 디렉터리의 경로는 path_provider 패키지를 사용하면 아주 쉽게 얻을 수 있다.
import 'package:path_provider/path_provider.dart';
Directory supportDirectory = await getApplicationDocumentsDirectory();
Application Support 디렉터리
Application Support 디렉터리는 말 그대로 어플을 구동하기 위해 필요한 데이터들이 담긴다. 예를 들면 어플을 사용하는 유저에 대한 정보, 앱 설정 데이터가 저장될 수 있다. 이 디렉터리에는 앱 구동을 위해 반드시 필요하나, 유저에게 공개하고 싶지 않은 민감한 데이터를 저장할 때 사용하면 된다.
이 디렉터리의 경로도 마찬가지로 path_provider 패키지를 사용하면 쉽게 얻을 수 있다.
import 'package:path_provider/path_provider.dart';
Directory supportDirectory = await getApplicationSupportDirectory();
Tmp 디렉터리
이름에서 알 수 있듯이 Tmp 디렉터리에는 임시 데이터가 저장된다. 잠깐 쓰고 버릴 데이터들을 이곳에 저장해서 활용한다. 삭제되어도 큰 문제가 없는 데이터들이 주로 저장되며 OS 혹은 유저에 의해 종종 비워지는 공간이다.
경로는 path_provider 패키지가 아닌, io 패키지를 사용하면 얻을 수 있다.
import 'dart:io';
Directory tmpDirectory = Directory.systemTemp;