6월 3일의 ⁠#Android11: 베타 버전 출시 행사에 참여하세요.

데이터 및 파일 저장소 개요

Android는 앱 데이터를 저장할 여러 가지 옵션을 제공합니다. 선택하는 솔루션은 데이터에 필요한 용량이 얼마인지, 어떤 종류의 데이터를 저장해야 하는지, 데이터를 해당 앱 전용으로 할지, 아니면 다른 앱과 사용자가 액세스할 수 있도록 할지 등 특정 필요에 따라 달라집니다.

이 페이지에서는 Android에서 제공하는 여러 가지 데이터 저장 옵션을 소개합니다.

  • 내부 파일 저장소: 기기 파일 시스템에 앱 전용 파일을 저장합니다.
  • 외부 파일 저장소: 공유된 외부 파일 시스템에 파일을 저장합니다. 이것은 일반적으로 사진과 같은 공유된 사용자 파일용입니다.
  • 공유 기본 설정: 전용 원시 데이터를 키-값 쌍으로 저장합니다.
  • 데이터베이스: 전용 데이터베이스에 구조화된 데이터를 저장합니다.

외부 저장소에 있는 일부 유형의 파일을 제외하고, 이런 모든 옵션은 앱 전용 데이터용입니다. 이 데이터는 기본적으로 다른 앱에서 액세스할 수 없습니다. 다른 앱과 파일을 공유하고자 하는 경우, FileProvider API를 사용해야 합니다. 자세한 내용은 파일 공유를 참조하세요.

앱의 데이터를 다른 앱에 노출하고자 하는 경우, ContentProvider를 사용하면 됩니다. 콘텐츠 제공자는 데이터에 대해 선택한 저장 장치와 관계없이(보통 데이터베이스이지만) 다른 앱에서 사용 가능한 읽기/쓰기 액세스를 완전히 제어할 수 있게 권한을 허용합니다. 자세한 내용은 콘텐츠 제공자를 참조하세요.

내부 저장소

기본적으로 내부 저장소에 저장된 파일은 해당 애플리케이션의 전용 파일이며 다른 애플리케이션(및 사용자)은 해당 파일에 액세스할 수 없습니다. 따라서 내부 저장소는 사용자가 직접 액세스할 필요가 없는 내부 앱 데이터를 저장하기에 좋습니다. 시스템이 파일 시스템에서 각 앱의 전용 디렉토리를 제공하므로 여기에 앱에 필요한 모든 파일을 정리하면 됩니다.

사용자가 앱을 삭제하면 내부 저장소에 저장된 파일이 삭제됩니다. 이런 식으로 작동하기 때문에 내부 저장소는 사용자가 앱과 관계없이 유지되기를 예상하는 파일을 저장하는 데 사용해서는 안 됩니다. 예를 들어 앱을 사용하여 사진을 캡처할 수 있는 경우, 사용자는 앱을 삭제한 뒤에도 그러한 사진에 액세스할 수 있을 것으로 예상할 것입니다. 그러므로 이러한 유형의 파일은 MediaStore API를 사용하여 적절한 미디어 컬렉션에 저장해야 합니다.

자세한 내용은 내부 저장소에 파일을 저장하는 방법MediaStore를 사용하여 검색어에 기반해 음악을 재생하는 방법을 참조하세요.

내부 캐시 파일

일부 데이터를 영구적으로 저장하기보다 임시로 보관하고자 하는 경우, 특수 캐시 디렉토리를 사용해 해당 데이터를 저장하면 됩니다. 각 앱에 이러한 종류의 파일에 사용할 전용 캐시 디렉토리가 있습니다. 기기의 내부 저장소 공간이 부족한 경우 Android는 해당 캐시 파일을 삭제하여 공간을 복구할 수 있습니다. 그러나 해당 캐시 파일을 정리하는 작업을 시스템에 의존해서는 안 됩니다. 캐시 파일은 항상 직접 관리하고, 사용된 공간의 합리적인 제한(예: 1MB) 이내로 유지해야 합니다. 사용자가 앱을 삭제하면 이러한 캐시 파일은 제거됩니다.

자세한 내용은 캐시 파일을 쓰는 방법을 참조하세요.

외부 저장소

모든 Android 기기는 파일을 저장하는 데 사용할 수 있는 공유된 "외부 저장소"를 지원합니다. 이 공간을 외부라고 부르는 것은 반드시 액세스할 수 있다고 보장된 공간이 아니기 때문입니다. 이것은 사용자가 컴퓨터에 외부 저장소 기기로 마운트할 수 있는 저장 공간이며, 심지어 물리적으로 제거할 수도 있습니다(SD 카드처럼). 외부 저장소에 저장된 파일은 누구든지 읽을 수 있으며, 컴퓨터에서 파일을 전송하는 데 USB 대용량 저장소를 사용하는 경우 사용자가 수정할 수 있습니다.

따라서 앱의 외부 저장소에 저장된 파일에 액세스하려 시도하기 전에, 액세스하려는 파일은 물론 외부 저장소 디렉토리의 이용 가능성을 확인해야 합니다.

대부분의 경우 다른 앱에서도 액세스할 수 있어야 하는 사용자 데이터이고 사용자가 앱을 제거한 뒤에도 저장되어야 하는 데이터라면 외부 저장소를 사용하는 것이 좋습니다. 캡처한 사진이나 다운로드한 파일 등이 좋은 예입니다. 시스템이 이런 종류의 파일을 위해 표준 공개 디렉토리를 제공하여 사용자가 사진, 벨소리, 음악 등을 모두 한곳에 보관할 수 있습니다.

사용자가 앱을 제거하면 시스템이 삭제하는 앱 특정 디렉토리 내의 외부 저장소에도 파일을 저장할 수 있습니다. 이것은 공간이 더 필요한 경우 내부 저장소 대신 사용하기 유용하지만, 여기 저장된 파일은 액세스하지 못할 수도 있습니다. 사용자가 저장소 SD 카드를 제거할 수 있기 때문입니다. 또한 이 파일은 여전히 누구나 읽을 수 있습니다. 다만 다른 앱과 공유하지 않는 위치에 저장되었을 뿐입니다.

자세한 내용은 외부 저장소에서 파일을 저장하는 방법을 참조하세요.

공유 기본 설정

데이터를 많이 저장하지 않아도 되고, 데이터에 구조가 필요하지 않다면 SharedPreferences를 사용해야 합니다. SharedPreferences API를 사용하면 원시 데이터 유형(boolean, float, int, long, string)의 영구적인 키-값 쌍을 읽고 쓸 수 있습니다.

키-값 쌍은 XML 파일에 작성되며 이 파일은 앱이 종료되더라도 모든 사용자 세션에서 유지됩니다. 파일 이름을 직접 지정하거나 액티비티별 파일을 사용하여 데이터를 저장할 수 있습니다.

"공유 기본 설정"이라는 API 이름은 약간 오해의 소지가 있습니다. 이 API를 "사용자 기본 설정"(예: 사용자가 선택한 벨소리)을 저장하는 데에만 사용하는 것은 아니기 때문입니다. SharedPreferences는 모든 종류의 단순한 데이터(예: 사용자의 최고 점수)를 저장하는 데 사용할 수 있습니다. 다만 실제로 앱의 사용자 기본 설정을 저장하고자 하는 경우라면 설정 UI 생성 방법을 참조하시기 바랍니다. 이 경우 Android X Preference Library를 사용하여 설정 화면을 빌드하고 사용자의 설정을 자동으로 유지합니다.

키-값 데이터를 저장하는 방법에 대해 알고 싶다면 공유 기본 설정으로 키-값 데이터 저장을 참조하세요.

데이터베이스

Android는 SQLite 데이터베이스를 완전히 지원합니다. 생성한 모든 데이터베이스는 앱에 의해서만 액세스할 수 있습니다. 그러나 SQLite API를 직접 사용하는 대신 Room 영구 라이브러리로 데이터베이스를 생성하고 관리하는 것이 좋습니다.

Room 라이브러리는 SQLite를 완벽히 활용하면서 원활한 데이터베이스 액세스를 지원하는 객체 매핑 추상화 계층을 제공합니다.

여전히 SQLite로 직접 데이터를 저장할 수 있지만, SQLite API는 레벨이 상당히 낮고 사용하려면 많은 시간과 노력이 필요합니다. 예를 들면 다음과 같습니다.

  • 원시 SQL 쿼리에 대해서는 컴파일 시간 검증 작업이 수행되지 않습니다.
  • 스키마가 바뀜에 따라 영향을 받는 SQL 쿼리를 수동으로 업데이트할 필요가 있습니다. 이 과정은 시간이 오래 걸리고 오류가 발생하기 쉬울 수 있습니다.
  • SQL 쿼리와 자바 데이터 객체 간에 변환하려면 상당량의 상용구 코드를 작성해야 합니다.

Room 영구 라이브러리는 SQLite를 통해 추상화 계층을 제공하는 동시에 이러한 문제도 해결해 줍니다.

Room을 사용하는 방법을 보여주는 샘플 앱을 확인하려면 GitHub에서 다음을 참조하세요.

데이터베이스 디버깅

Android SDK는 SQLite 데이터베이스에서 테이블 콘텐츠를 찾아보고 SQL 명령을 실행하고 기타 유용한 기능을 수행할 수 있는 sqlite3 데이터베이스 도구를 포함합니다. 자세한 내용은 adb 문서를 참조하세요.

추가 리소스

데이터 저장소에 대한 자세한 내용은 다음 리소스를 참조하세요.

코드랩