본문 바로가기
flutter/Tip

Flutter[플러터] / shared_preferences 은 어떻게 데이터를 저장하는 것일까?

by ch5c 2024. 11. 19.
반응형

우리가 앱 개발을 할 때 꼭 하나쯤은 사용하는 것이 있는데 그것이 바로 shared_preferences 이다.

아마 다들 이 셰어드 프리페런스가 앱에다가 데이터를 저장한다는 것은 알고 있을 텐데 정확히 어떻게, 어디에 저장하는지는 잘 모를 것이다. 이번 포스팅에서는 그것에 대해 알아보자.

 

자 일단은 맨 처음, pubspec.yaml 파일부터 봐보자.

너무 당연한 것이긴 하다만 shared_preferences를 사용하고 싶다면 pubspec.yaml 파일에다가 Pub get 을 해줘야 한다.

그다음은 이제 사용하는 것인데 간단하게 iniState를 사용하여 데이터를 저장하는 코드만 적어보겠다.

@override
void initState() {
  super.initState();
  WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
    final sharedPref = await SharedPreferences.getInstance();
    sharedPref.setString('sharedPref_test', sharedPref.toString());
  },);
}

 

자 대충 이렇게 만들어서 데이터를 저장하는 코드를 적었으니 직접 실행을 시킨 다음 이 코드를 실행시키자.

그럼 이제 데이터가 저장이 되었을 것인데 어디에다가 저장이 되었는지 궁금할 것이다.

안드로이드 스튜디오 기준이다.

이 경로로 들어가 준다.

그다음에 Device Explorer 가 열릴 것인데 여기서 이제 FlutterSharedPreferences.xml 파일을 찾아야 한다.

경로는 이렇다.

 

data/data/[앱 패키지 이름]/shared_prefs/FlutterSharedPreferences.xml

 

이렇게 파일을 들어갔다면 나와 같은 코드를 볼 수 있을 것이다.

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="flutter.sharedPref_test">Instance of 'SharedPreferences'</string>
</map>

 

보는 것처럼 이러한 형식으로 저장이 된다

이름은 "flutter.키 값" 이런 식으로 되고 그 뒤에는 자신이 넣은 밸류값이 저장되는 형식이다.


 

자 그럼 이런 걸 보면 한 번쯤은 생각할 것이다. 이 데이터를 삭제하면 그대로 반영이 되는가?

결론부터 말하자면 반영이 된다!!!

허나 그 파일 자체를 삭제하지 않고 파일 안에 있는 코드들만 삭제한다면 앱 내부에 있는 데이터들이 다시 데이터를 수복할 것이다.

또한 이렇게 강제로 삭제하는 경우 기존에 불러와져야 하는 데이터가 안 불러와지면서 코드에 오류가 뜰 확률이 높아진다.

(사실상 별로 추천하지 않음)

 

그런데 이것만으론 좀 심심하지 않은가?

 

이번엔 setStringList로 저장되는 형식 봐보자.

 

<string name="flutter.user_list">VGhpcyBpcyB0aGUgcHJlZml4IGZvciBhIGxpc3QurO0ABXNyABNqYXZhLnV0aWwuQXJyYXlMaXN0eIHSHZnHYZ0DAAFJAARzaXpleHAAAAAFdwQAAAAF&#10;dAA1eyJ1c2VyX2lkIjoidXNlcjEwMSIsImJhY2tncm91bmRfY29sb3IiOlszMSwyNDUsMjM4XX10&#10;ADB7InVzZXJfaWQiOiJzYSIsImJhY2tncm91bmRfY29sb3IiOlsyNDksMTQyLDc2XX10ADJ7InVz&#10;ZXJfaWQiOiJwZXJzb24iLCJiYWNrZ3JvdW5kX2NvbG9yIjpbODgsMTQsOTNdfXQAMnsidXNlcl9p&#10;ZCI6InNzc3MiLCJiYWNrZ3JvdW5kX2NvbG9yIjpbMTQ1LDg1LDE1OF19dAAyeyJ1c2VyX2lkIjoi&#10;ZGRkZCIsImJhY2tncm91bmRfY29sb3IiOlszNywxMTYsMjE0XX14&#10;    </string>

 

일단 우리는 읽을 수 없다.

읽을 수는 없지만 대충 뭔지를 알 수 있는 것 같다. 코드에 &10; 요 친구가 주기적으로 있는데 이걸로 데이터를 구분해 주는 것 같다. 그니까 지금 이 코드는 여러 개의 데이터 코드인 것이다.

 

보면 Base64 로 인코딩되어 저장된 것을 알 수 있는데 왜 이렇게 저장해 놓은 것일까?

그 이유는 Flutter에서 리스트나 복잡한 데이터를 저장할 때, 이를 문자열로 변환하고 Base64로 인코딩하여 저장하기 때문이다.

 

이걸 디코딩해보면 내가 저장한 데이터가 뭔지 알 수 있을 것이다.

암튼 간에 이렇게 간단하게 이런 게 이런게 있다~ 정도로 알아보았다. 유익했길 바라며 마치겠다.

반응형

 

반응형