Android Proto Data Store

Ham's Velog·2024년 4월 13일
post-thumbnail

DataStore란?

안드로이드에서는 사용자의 로그인 정보, 앱 내 설정 등 특정 데이터를 지속적으로 유지해야 할 필요가 있다. 예를 들어 자동 로그인 기능을 구현하기 위해 필요한 인증 토큰이나 사용자의 설정을 앱이 기억하도록 해야 할 경우가 이에 해당한다. 이런 데이터를 효과적으로 관리하기 위해 Google은 안드로이드 개발자들에게 Preferences라는 메커니즘을 제공하고 있다. 이 시스템은 간단한 키-값 쌍을 이용하여 앱의 설정 데이터를 저장하고 관리할 수 있게 해준다.

Preference: 키와 그 값을 저장하고 꺼내는 간단한 매커니즘

안드로이드에서 이를 빠르고 간단하게 구현하기 위해 SharedPreference를 사용할 수 있다. 하지만 DataStore를 사용하면 다음과 같은 기능을 추가로 제공받을 수 있다.

  1. 비동기식 작업 지원
  2. 타입 안전성 제공

*참고로 DataStore 구현 방식은 2가지가 존재한다. Preferences DataStore와 Proto DataStore
간단하게 두가지의 차이는 키-값을 가지고 데이터를 읽기, 쓰기 방식과 스키마를 이용하여 데이터를 읽기, 쓰기 방식의 차이라고 볼수 있다. 이번 포스팅에서는 제목과 같이 Proto DataStore에 대해서 알아볼 것이다.

Proto DataStore 장점

1. 비동기식 작업 지원

SharedPreference는 DataStore와는 다르게 데이터를 읽거나 쓸때 비동기식 작업을 지원하지 않는다. 즉, 메인 스레드를 이용하여 데이터를 다루게 되는데 이경우 어떤 문제가 발생될 수 있을까?

안드로이드는 UI를 그릴때 메인 스레드를 이용하여 UI를 그린다. SharedPreference가 메인 스레드를 이용하여 데이터를 다루게 된다면 UI를 그리는 메인 스레드가 Block이 된다는 뜻이며 이러한 상황이 지속되면 앱은 ANR이 발생될 수 있다.

ANR : Application Not Responding - 애플리케이션 응답 없음

이를 방지하기위해 DataStore는 비동기식 작업을 지원한다. 그렇다면 DataStore는 어떻게 비동기식 작업을 지원할 수 있을까?

DataStore가 비동기식 작업을 지원할 수 있는 이유는 DataStore가 코루틴과 플로우를 활용하고 있기 때문이다. 이로인해 DataStore는 비동기식 작업을 지원하여 메인 스레드 블락 없이 안전하게 개발할 수 있다.

2. 타입 안전성 제공

타입 안전성 제공은 Preference DataStore에서 가지지 못하는 Proto DataStore만의 장점이다. 그렇다면 Preference DataStore는 어떻길래 Proto DataStore에서만 타입 안전성을 제공할 수 있는걸까? 우선 각각의 데이터 타입 사용에 대해 알아보자.

Preference DataStore는 기본적인 타입의 데이터를 키-값으로 읽거나 쓸수 있다. 여기서말하는 기본적인 타입의 데이터란 int, string, float, double, boolean, long, Set<String>을 뜻한다. 해당 타입들은 double을 제외하곤 모두 SharedPreference에서 가져온 데이터 타입과 동일하다.

이에반해 Proto DataStore는 Protocol Buffers의 데이터 타입과 동일하게 사용이 가능하다.

Protocol Buffers 데이터 타입 모음

다시 돌아와 '타입 안전성'을 생각해보자. Preference DataStore는 키-값을 데이터 스토어에 저장하는 형태이다. 이는 개발자가 데이터 모델을 미리 생성하지않고 코드상에서 추가한다는 의미이기도 하다. 하지만 Proto DataStore는 위 설명과 같이 Protocol Buffers를 이용하여 스키마를 정의하고 사용하는 형태이다.

Proto DataStore Code Lab을 보면 .proto 파일을 생성하는 단계가 있다. Proto DataStore는 필수로 Protocol Buffers 스키마를 정의해주는데 해당 스키마 파일이 존재하기 때문에 '타입 안전성'을 제공받을 수 있는것이다. 개발자가 사용할 데이터 모델을 Protocol Buffers 스키마 내에서 정의하고 다루기 때문에 사용할 데이터에 접근을 위해선 타입 안전성은 자연스럽게 따라올수 밖에 없는 구조이다.

참고한 자료

profile
#안드로이드개발자

0개의 댓글