[안드로이드] 데이터 및 파일 저장에 따른 분기

hee09·2022년 4월 24일
0
post-thumbnail

데이터와 파일

안드로이드는 윈도우 파일 시스템과 같이 디스크에 기반을 둔 파일 시스템입니다. 만약 앱에서 데이터를 저장해야 한다면 아래와 같은 옵션을 선택해서 상황에 맞는 방법을 사용해서 데이터를 저장할 수 있습니다.

  1. 앱 개별 저장소(App-specific storage)
    현재 앱에서만 오직 사용할 파일들을 저장할 때 사용하며, 내부 저장소의 전용 디렉토리 또는 외부 저장소 내의 전용 디렉토리를 사용합니다. 민감한 정보를 저장할 때는 내부 저장소의 전용 디렉토리를 사용하면 됩니다.

  2. 공유 저장소(Shared storage)
    다른 앱에 공유되어도 상관이 없는 미디어(사진, 동영상 등), 문서, 파일 등을 저장할 때 사용합니다.

  3. Preferences
    개인적인 데이터나 원시 데이터를 키-값 쌍으로 저장할 때 사용합니다.

  4. Databases
    Room 라이브러리를 사용하여 구조화된 데이터를 데이터베이스에 저장할 때 사용합니다.

요약


저장소 위치의 구분

안드로이드는 두 타입의 물리적 저장소(내부 저장소, 외부 저장소)를 제공합니다. 대부분의 기기에서 내부 저장소는 외부 저장소보다 용량이 작습니다. 그러나 내부 저장소는 모든 기기에서 사용할 수 있지만, 외부 저장소는 모든 기기에서 사용할 수 없습니다.

앱은 기본적으로 내부 저장소에 저장됩니다. 만약 APK의 크기가 너무 크다면 Manifest 파일을 수정하여 내부 저장소 대신 외부 저장소에 앱을 설치할 수 있습니다.

<manifest ...
  android:installLocation="preferExternal">
  ...
</manifest>

외부 저장소 접근 권한

안드로이드는 READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE, MANAGE_EXTERNAL_STORAGE와 같은 저장소 관련 권한을 제공합니다.

예전 버전의 안드로이드(Legacy Storage)에서는 외부 저장소의 개별 저장소 이외 저장소의 파일들에 접근하려면 READ_EXTERNAL_STORAGE 권한을 요구했습니다. 또한, 개별 저장소 이외 저장소에 파일을 저장하려고 하면 WRITE_EXTERNAL_STORAGE 권한이 필요했습니다.

최근의 안드로이드 버전(Scoped Storage)은 특정한 파일에 접근하고 저장하는 앱의 기능을 결정하기 위해 위치보다는 파일의 목적에 더 의존합니다. 특히, Android 11(API level 30) 이상의 버전에서는 WRITE_EXTERNAL_STORAGE 권한이 더이상 저장소에 접근하는데 영향을 주지 않습니다. 이런 목적의 저장소 모델은 앱이 실제로 사용하는 장치의 파일 시스템 영역에만 액세스할 수 있기에 사용자의 사용자의 개인 정보 보호를 향상시켜줍니다.

Android 11에서 MANAGE_EXTERNAL_STORAGE 권한이 추가되었는데, 이 권한은 개별 저장소와 MediaStore 외부의 파일에 대한 쓰기 액세스를 제공합니다. File Manager 앱, 백신 앱, 문서 정리 앱과 같이 디바이스의 저장소에 있는 모든 파일들을 관리하는 앱은 해당 Permission을 사용하면 되는데, 이 권한에 대한 자세한 내용은 manage all files에 나와있습니다.


Scoped Storage

안드로이드 10(API Level 29) 버전 이후로는 Scoped Storage라는 정책이 채택되었습니다. 그림과 함께 10 버전 이전과 이후를 요약해보겠습니다. 왼쪽은 안드로이드 10 버전 이전, 오른쪽은 안드로이드 10 버전 이후의 내부/외부 저장소에 대한 그림입니다.

  • 내부 저장소
    내부저장소는 그림과 같이 Legacy Storage와 Scoped Storage가 차이가 없습니다. 따라서 이전의 방법과 동일하게 사용하면 됩니다. 내부 저장소의 개별 앱 공간에 대한 접근 방법은 내부 저장소와 외부 저장소 - 내부 저장소에 나와있습니다.

  • 외부 저장소 - 개별 앱 공간
    외부 저장소의 개별 앱 공간은 한가지 차이를 제외하고는 차이가 없습니다. Legacy Storage는 권한만 보유하고 있다면 다른 앱의 개별 앱 공간에 접근할 수 있었는데, Scoped Storage는 다른 앱의 개별 앱 공간에 접근할 수 없습니다. 이를 제외하고 나머지는 이전의 방법과 동일하게 사용하면 됩니다. 외부 저장소의 개별 앱 공간에 대한 접근 방법은 내부 저장소와 외부 저장소 - 외부 저장소에 나와있습니다.

  • 외부 저장소 - 미디어

  • 외부 저장소 - 다운로드
    Scoped Storage의 외부 저장소에 있는 공간입니다. 다운로드 공간에 대한 접근은 SAF(Storage Access Framework)를 사용하면 됩니다. SAF에 대한 사용 방법은 안드로이드 - SAF(Storage Access Framework)로 파일 읽고 쓰는 방법에 나와있습니다.

Legacy Storage와 Scoped Storage의 차이점을 요약, 정리하였는데 자세한 내용은 Scoped Storage(범위지정 저장소) 정리(Legacy Storage와 차이점 정리)에 나와있습니다.


결론

앱에서 사용하는 데이터나 파일을 저장할 때는 어떤 타입의 데이터인지를 파악한 후 위의 옵션들 중 하나를 선택해서 저장하면 됩니다.


참조
앱 개별 저장 공간
Scoped Storage(범위지정 저장소) 정리 (Legacy Storage와 차이점 정리)
안드로이드 - MediaStore에서 미디어 파일 정보 읽는 방법
Android Media Store Sample

틀린 부분은 댓글로 남겨주시면 수정하겠습니다..!!

profile
되새기기 위해 기록

0개의 댓글