반응형

2023년부터 최소 1달에 Android 기술 관련 게시물을 하나씩 작성해보고자 한다.
이번 게시물은 그 첫 번째인 DataStore이다.

이 글은 개인 또는 현업에서 프로젝트를 개발하면서 DataStore를 왜 사용하는가에 대한 답변이라 생각하고 게시물을 작성했다.
최하단에 DataStore를 공부하면서 만든 예제를 첨부했다.
혹시 궁금하다면 예제를 확인하면 된다 :)

 

Why DataStore?

우리는 기존에 Android에서 작은 단위의 데이터(간단한 형식의 Int, Boolean, String 등등....)을 저장할 때 SharedPreferences를 사용 했다.
SharedPreferences는 익숙하고 편리하다는 장점이 있지만, 다음과 같은 단점을 갖고 있다.

  • parsing 과정에서 runtime exception을 발생시킴
  • 안전해 보이지만(비동기처럼 보이지만) 내부적으로 동기적으로 동작됨 -> ANR의 원인이 됨

이러한 단점을 보완하여 나온것이 바로 DataStore 이다.

 

What is DataStore?

Android에서 Clean Architecture를 구현하기 위해 제공하는 Jetpack의 AAC를 먼저 알필요가 있다.
Android에서 이야기하는 Clean Architecture는 다음과 같다.

일반적인 Clean Architecture와 유사하게 UI, Domain, Data Layer로 나뉘어져 있다.
AAC는 이같은 Layer들을 구현하기 위해 Layer 별로 라이브러리를 제공하고 있으며, 그중 DataLayer에 속하는게 DataStore이다.

(대충 이런 모습...)

DataStore는 SharedPreferences에 비해 다음과 같은 특징을 갖는다.

큰 특징으로는 아래와 같은 특징들이 있다.

  • 비동기적으로 처리해야만 하지만, UI스레드에서 호출하기에 안전하다.(ANR로 부터 비교적 안전)
  • 컴파일 타임에서 에러를 발생하기 때문에 런타임 에러로부터 안전하다.(Crash로부터 비교적 안전)
  • Migration을 제공하여 SharedPreferences로부터의 이전이 가능하다.

그렇기에 결론적으로 DataStore는 ANR, Crash로부터 안전하다!

 

How to Use DataStore?

DataStore를 사용하기 위해 고려해야 할 점은 크게 아래와 같다.

  • preferences vs proto
  • Rx vs Coroutines

본인 혹은 회사에서 사용하는 기술 스택에 따라 달라질 것 같은데, 먼저 DataStore 타입에 대해 설명해보고자 한다.

Preferences DataStore

Preferences DataStore는 다음과 같은 특징을 갖는다.

  • key/value 형식의 데이터 관리
  • 지정된 데이터 형식 사용
  • SharedPreferences와 유사한 동작 방식
  • 비교적 간단

Preferences DataStore에서 제공하는 지정된 데이터 형식은 다음과 같다.
자주 사용할만한 형식에 체크를 해봤다 :)

Proto DataStore

Proto DataStore는 아래와 같은 특징을 갖는다.

  • protocol buffer를 사용
  • 데이터를 커스텀할 수 있음
  • 변수명 지정해야 함
  • 구현에 공수가 비교적 더 듦
    • proto 구현 필요
    • serializer 구현 필요

Asynchronous?

위 설명에서 DataStore는 비동기로의 실행이 강제된다 했는데, 그럼 동기적으로 사용할 수 있는 방법은 없을까?

공식문서에서는 runBlocking을 사용하는 방법을 소개하고 있지만, 꼭 필요한 상황이 아니라면 절대 사용하지 말라고 하고 있다.

val exampleData = runBlocking { context.dataStore.data.first() }
더보기

Caution: Avoid blocking threads on DataStore data reads whenever possible. Blocking the UI thread can cause ANRs or UI jank, and blocking other threads can result in deadlock.

그럼으로 DataStore는 비동기로만 사용하자! ^^

 

예제

 

GitHub - semin0151/DataStoreExample: You can learn DataStore by this sample code.

You can learn DataStore by this sample code. Contribute to semin0151/DataStoreExample development by creating an account on GitHub.

github.com

 

References

AAC

 

앱 아키텍처 가이드  |  Android 개발자  |  Android Developers

앱 아키텍처 가이드 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 가이드에는 고품질의 강력한 앱을 빌드하기 위한 권장사항 및 권장 아키텍처가 포함

developer.android.com

DataStore

 

앱 아키텍처: 데이터 영역 - Datastore - Android 개발자  |  Android Developers

데이터 영역 라이브러리에 관한 이 앱 아키텍처 가이드를 통해 Preferences DataStore 및 Proto DataStore, 설정 등을 알아보세요.

developer.android.com

Preferences DataStore

 

Preferences Datastore를 사용하여 작업하기  |  Android Developers

이 Codelab에서는 샘플 앱을 수정하여 SharedPreferences를 대체하는 새로운 향상된 데이터 저장소 솔루션인 Jetpack Preferences Datastore를 통합합니다.

developer.android.com

Proto DataStore

 

Proto Datastore를 사용하여 작업하기  |  Android Developers

이 Codelab에서는 SharedPreferences를 대체하도록 새롭게 개선된 데이터 저장 솔루션인 Jetpack Proto Datastore를 통합하도록 샘플 앱을 수정합니다.

developer.android.com

protocol buffer

 

Protocol Buffers  |  Google Developers

프로토콜 버퍼는 구조화된 데이터를 직렬화하는 데 사용되는 언어 중립적인 플랫폼 중립적인 확장 메커니즘입니다.

developers.google.com

 

언어 가이드 (proto3)  |  Protocol Buffers  |  Google Developers

참고: 이 사이트는 지원 중단되었습니다. 이 사이트는 2023년 1월 31일 이후 지원이 중단되며 트래픽은 https://protobuf.dev에서 새 사이트로 리디렉션됩니다. 그때까지는 protobuf.dev로만 업데이트됩니

developers.google.com

 

반응형

'Android' 카테고리의 다른 글

Foreground Service  (0) 2023.06.02
Service  (0) 2023.05.24
해상도  (0) 2023.04.30
DI(Koin)  (0) 2023.02.27

+ Recent posts