Flutter

[Flutter] DB 없이 데이터 저장하는 방법 (Shared Preferences)

hminor 2023. 8. 11. 17:01

DB 없이 데이터 저장하는 방법 (Shared Preferences)

  • 우선 데이터를 보존하는 방법으로는 몇 가지가 있는데
    • 첫 째는 가장 기본적인 방법으로 서버로 보내서 DB에 저장하기
    • 둘 째는 폰 메모리카드에 저장하는 방법으로 Shared Preferences 가 된다.
      • 그래서 따로 데이터, 캐시를 삭제하지 않으면 영구 보관이 가능하다.
    • 그래서 보통 중요한건 DB에 저장, 아니면 Shared Preferences 로 저장!
  • Shared Preferences 설치 셋팅
    • pubspec.yaml에 아래의 코드 추가하기
dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.4
  image_picker: ^0.8.4+4
  shared_preferences: ^2.0.11
  • main.dart에 설치한거 불러오기
// shared_preferences
import 'dart:convert'; // <- 이건 있으면 안해도 됨
import 'package:shared_preferences/shared_preferences.dart'
  • Shared Preferences 사용
    • 저장하기
      • 비동기 통신으로 해야하기에 async, await을 사용하기
      • 변수에 SharedPreferences.*getInstance*() 를 담은 다음 변수.setString()으로 담아주기
      • setString으로는 key, value 값으로 (’이름’, ‘데이터’)를 담아주면 된다.
      • 여기서 저장하는 함수가 다양하다
        • .setString()
        • .setBool()
        • .setInt()
        • .setDouble()
        • .setStringList()
    • 사용하기
      • getString()으로 가져올 데이터 이름을 작성후 실행
      • 아니면 get()으로만 해도 된다.
      • 다만 정확하게 데이터를 꺼내고 싶다면
        • .getString()
        • .getBool() … 이런식으로 작성해야 한다.
    saveData() async{
        var storage = await SharedPreferences.getInstance();
        storage.setString('이름', 'hminor');
    		var data = storage.get('이름') // hminor
      }
    
    • 삭제하기
      • .remove(’이름’)
    • 이외 특수 케이스
      • map자료(Object) 저장
        • 따로 map 자료를 저장하는 방법이 없기에 setString()에 데이터의 값을 JSON 형태로 jsonEncode()로 변형 후 저장하고 사용시엔 jsonDecode()로 변형 후 사용하기
        var map = {'name': 'ki'};
        var storage = await SharedPreferences.getInstance();
        storage.setString('map', jsonEncode(map)); // <- 저장
        storage.get('map')
        
        • 다만 위의 코드처럼 작성하게 되면 에러가 발생하게 되는데
          • 이유는 가져오는 타입이 문자인지 아닌지 알 수 없는 Object 형태이기 때문
          • 그래서 getString으로 정확하게 작성해주는 것이 더욱 좋은 방법!
          var map = {'name': 'ki'};
          var storage = await SharedPreferences.getInstance();
          storage.setString('map', jsonEncode(map)); // <- 저장
          storage.getString('map')
          
        • 그리고 이렇게 작성을 해도 아직 확실하게 문자인지 알 수 없다고 에러가 발생한다.
          • 그래서 조건문을 활용해서 데이터가 없다면 담아줄 문자를 작성해주어 해결!
          var map = {'name': 'ki'};
          var storage = await SharedPreferences.getInstance();
          storage.setString('이름', jsonEncode(map));
          var result = storage.getString('이름')??'데이터가 없다.';
          print(jsonDecode(result)['name']);
          
  • 그래서 Shared Preferences를 사용하는 용도로
    • 인스타그램을 예시로 들 수 있다.
      • 한 번 본 게시글은 빠르게 렌더링이 되는데 이유는
      • 폰 메모리에 저장해뒀기 때문이다.
    • 장점
      • 빠른 로드
      • 서버 부하 감소
    • 단점