shared_preferences

하요·2024년 6월 21일
0
post-thumbnail

Flutter에서 로컬 데이터 관리하기: Shared Preferences

SharedPreferences 플러그인은 Flutter 애플리케이션에서 간단한 설정 값이나 작은 데이터를 영구적으로 저장할 수 있는 방법을 제공합니다. 이 플러그인은 iOS 및 macOS에서 NSUserDefaults, Android에서 SharedPreferences 등을 사용하여 데이터를 저장합니다.

주요 특징

  1. 간단한 데이터 저장:
    • Shared Preferences는 주로 문자열(String), 정수(Integer), 부울(Boolean), 부동 소수점 숫자(Double), 문자열 집합(List of Strings)과 같은 간단한 데이터 유형을 저장하는 데 사용됩니다.
  2. Key-Value 저장 방식:
    • 모든 데이터는 키-값 쌍의 형태로 저장됩니다. 키를 사용하여 데이터를 쉽게 저장하고 검색할 수 있습니다.
  3. 플랫폼 독립적:
    • Android와 iOS 모두에서 동일한 방식으로 동작하며, 두 플랫폼에서 데이터를 동일하게 관리할 수 있습니다.
  4. 비교적 작은 데이터 저장:
    • 앱의 설정 값이나 사용자 선호도와 같은 작은 데이터를 저장하는 데 적합합니다. 큰 데이터나 복잡한 데이터 구조는 데이터베이스를 사용하는 것이 좋습니다.

설치

pubspec.yaml 파일에 shared_preferences를 종속성으로 추가합니다.

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.0.6

사용 방법

데이터 쓰기

// Obtain shared preferences.
final SharedPreferences prefs = await SharedPreferences.getInstance();

// Save an integer value to 'counter' key.
await prefs.setInt('counter', 10);
// Save a boolean value to 'repeat' key.
await prefs.setBool('repeat', true);
// Save a double value to 'decimal' key.
await prefs.setDouble('decimal', 1.5);
// Save a string value to 'action' key.
await prefs.setString('action', 'Start');
// Save a list of strings to 'items' key.
await prefs.setStringList('items', <String>['Earth', 'Moon', 'Sun']);

데이터 읽기

// Obtain shared preferences.
final SharedPreferences prefs = await SharedPreferences.getInstance();

// Try reading data from the 'counter' key. If it doesn't exist, returns null.
final int? counter = prefs.getInt('counter');
// Try reading data from the 'repeat' key. If it doesn't exist, returns null.
final bool? repeat = prefs.getBool('repeat');
// Try reading data from the 'decimal' key. If it doesn't exist, returns null.
final double? decimal = prefs.getDouble('decimal');
// Try reading data from the 'action' key. If it doesn't exist, returns null.
final String? action = prefs.getString('action');
// Try reading data from the 'items' key. If it doesn't exist, returns null.
final List<String>? items = prefs.getStringList('items');

데이터 삭제

// Remove data for the 'counter' key.
await prefs.remove('counter');

주의사항 및 팁

  • 메인 함수에서 초기화: SharedPreferences는 기본적으로 싱글톤 패턴을 사용하여 애플리케이션 전체에서 동일한 인스턴스를 사용합니다. 비동기 초기화이므로 메인 함수에서 미리 초기화하는 것이 좋습니다. 초기화가 완료되기 전에 메소드를 호출하면 오류가 발생할 수 있으므로 주의해야 합니다.
    void main() async {
      WidgetsFlutterBinding.ensureInitialized();  // Flutter 프레임워크 초기화
      final SharedPreferences prefs = await SharedPreferences.getInstance();  // Shared Preferences 초기화
      runApp(MyApp(prefs: prefs));
    }
    
  • 다중 인스턴스 문제 방지: SharedPreferences를 여러 isolate나 엔진 인스턴스에서 사용할 때는 캐시가 최신 상태인지 확인하기 위해 reload()를 호출하는 것이 좋습니다.
  • 테스트에서 모킹: 테스트 환경에서 SharedPreferences를 모킹하여 초기 값을 설정하고 테스트할 수 있습니다.
    final Map<String, Object> values = <String, Object>{'counter': 1};
    SharedPreferences.setMockInitialValues(values);
    
  • 데이터 저장의 한계: 데이터는 비동기적으로 디스크에 저장될 수 있으며, 반환 후에도 쓰기가 디스크에 저장된다는 보장이 없으므로 중요한 데이터를 저장하는 데 이 플러그인을 사용해서는 안 됩니다.
  • 마이그레이션 및 접두사: 기본적으로 SharedPreferences 플러그인은 flutter. 접두사로 시작하는 preference만 읽고 씁니다. setPrefix를 호출하여 다른 접두사를 사용할 수 있으며, 인스턴스 생성 전에 호출해야 합니다. 접두사를 빈 문자열로 설정하면 (''), 모든 preference에 접근할 수 있습니다. allowList를 설정하여 지원되는 유형의 preference만 허용할 수 있습니다.

주요 활용도

  • 설정 값 저장: 사용자 설정, 앱 설정 값 등을 영구적으로 저장합니다.
  • 작은 데이터 저장: 간단한 문자열, 숫자 등의 데이터를 저장합니다.
  • 보안 데이터 저장: 간단한 인증 정보나 토큰을 저장합니다. (보안이 중요한 데이터는 flutter_secure_storage 사용 권장)

관련 자료

profile
flutter 개발자(진)

0개의 댓글