[Flutter] 어플리케이션 내부 DB 관리: 기기 저장소(Android/iOS)

김민서·2023년 9월 15일
0

가림 치료 앱 개발

목록 보기
4/6

아이패치 스캔 기록 관리에 관련된 여러 기능 구현을 위해 핸드폰 기기 저장소에 대한 이해가 필요했다.

먼저 Flutter의 sqflite 라이브러리의 getDatabasePath() 함수를 통해 얻어오는 경로는 다음과 같다.

  • Andriod: data/data/<package_name>/databases
  • iOS / MacOS: Documents directory

Android에는 내부 저장소와 외부 저장소가 존재한다.

  • 내부 저장소:
    - 다른 앱에서 접근할 수 없음.
    - 해당 앱 내에서 접근할 때 별도의 접근 권한 허용이 필요 없음.
    - 사용자도 접근할 수 없음.
    - 앱을 삭제하면 함께 삭제됨.
  • 외부 저장소:
    - 외부에서 접근할 수 있음.
    - 해당 앱 내에서 접근할 경우 별도의 접근 권한 허용이 필요함.
    - 앱을 삭제해도 남아있음.

Android의 경우 sqflite 라이브러리를 통해 저장한 기기 스캔 기록 테이블이 저장되어 있는 경로인 data/data/<package_name>는 내부 저장소에 해당한다. 때문에 사용자는 이 파일에 접근할 수 없다. 그래서 이를 다른 파일로 추출하여(CSV 파일) 외부에서 접근 가능한 외부 저장소에 저장하는 단계가 필요했다. (또한 전체 기록 테이블에서 사용자가 원하는 시간대의 부분 기록만 추출할 수 있는 기능도 필요했기 때문에 이 방법을 생각했다.)

iOS 참고 사이트
iOS 참고 사이트

iOS의 경우 App Sandbox라는 개념이 존재한다.

  • App Sandbox
    entitlements를 통해 요청 리소스에 대한 어플리케이션의 접근을 제어하여 시스템 리소스와 사용자 데이터를 보호함.
    • entitlements
      • 앱이 특정 시스템 리소스 또는 기능에 접근하고 사용할 수 있도록 하는 권한
      • 앱에서 필요한 권한을 식별하고, 시스템이 이를 관리하도록 도와줌.
      • 이를 통해 사용자의 개인 정보와 시스템 리소스를 보호할 수 있고 앱이 제한된 권한 내에서 작동하도록 함.

SandBox는 Bundle Container, Data Container, iCloud Container로 구성되는데 이 중 내가 살펴봐야 할 것은 앱의 데이터를 저장하는 Data Container이다. 이는 다음과 같이 구성되어 있다.

  • Data Container
    - Documents: 사용자가 생성한 콘텐츠(파일 등)를 저장하는 데 사용된다. 이 디렉토리의 내용은 파일 공유 앱(iTunes 등)을 통해 사용자에게 제공될 수 있고 iClouds를 통해 백업이 가능하다. (앱 삭제시 같이 삭제됨)
    - Library: 사용자 데이터 파일이 아닌 모든 파일을 위한 최상위 디렉토리
    - tmp: 오래 저장되지 않아도 되는 임시 파일을 쓰기 위해 사용된다. 해당 디렉토리에서 파일이 더 이상 필요하지 않을 때 앱은 이 파일을 제거한다. 이 디렉토리는 iTunes 또는 iCloud에서 백업되지 않는다.

Documents 디렉토리에 CSV 파일을 저장하면 기기 스캔 기록을 외부에서 접근 가능하기 때문에 여기에 저장하도록 했다. (path_provider 라이브러리 사용하여 Documents 디렉토리의 경로를 가져올 수 있음.)

Android, iOS 저장소 접근 코드는 다음과 같다.

String path = '';
if (Platform.isAndroid) {
  // 외부저장소의 다운로드 폴더로 경로 설정
	path = await ExternalPath.getExternalStoragePublicDirectory(ExternalPath.DIRECTORY_DOWNLOADS);
}
else if (Platform.isIOS) {
  // Documents 폴더로 경로 설정
 	Directory directory = await getApplicationDocumentsDirectory();
    path = await getApplicationDocumentsDirectory().path;
}

// 해당 path에 디렉토리 생성
final directory = Directory("$path/EyePatch");

// * 권한 허용 필수
var status = await Permission.manageExternalStorage.status;
if (!status.isGranted) {
  await Permission.manageExternalStorage.request();
}
if ((await directory.exists())) {
  print("존재하는 디렉토리입니다.");
} else {
  directory.create();
  print('새로운 디렉토리를 하나 생성합니다.');
}

이렇게 외부 저장공간에 파일이나 폴더를 생성할 때에는 반드시 권한 허용을 해줘야 한다. permission_handler를 통해서 외부 저장공간 접근 허용을 해주었다.

0개의 댓글