Flutter 개발-8: 데이터 지속성 구현

안녕하세요, Flutter 개발 시리즈의 마지막 포스팅에 오신 것을 환영합니다! 이번 글에서는 앱의 데이터를 영구적으로 저장하고 불러오는 방법에 대해 알아보겠습니다. 코드의 의미를 자세히 설명하여 초보자도 쉽게 이해할 수 있도록 하겠습니다.

1. 데이터 지속성이란?

데이터 지속성은 앱이 종료되거나 기기가 꺼져도 데이터가 유지되는 것을 말합니다. 이는 사용자 경험을 크게 향상시키는 중요한 기능입니다.

2. Flutter에서의 데이터 지속성 구현 방법

Flutter에서는 여러 가지 방법으로 데이터 지속성을 구현할 수 있습니다. 이번 포스팅에서는 가장 간단하고 널리 사용되는 두 가지 방법을 살펴보겠습니다:

  1. SharedPreferences
  2. SQLite 데이터베이스

3. SharedPreferences 사용하기

SharedPreferences는 간단한 키-값 쌍의 데이터를 저장하는 데 적합합니다.

3.1 SharedPreferences 설치

먼저 pubspec.yaml 파일에 다음 의존성을 추가합니다:

dependencies:
  shared_preferences: ^2.0.12

그리고 터미널에서 다음 명령을 실행합니다:

flutter pub get

3.2 SharedPreferences 사용 예제

import 'package:shared_preferences/shared_preferences.dart';

// 데이터 저장하기
Future<void> saveData() async {
  final prefs = await SharedPreferences.getInstance();
  await prefs.setString('username', 'Flutter개발자');
  await prefs.setInt('age', 25);
  await prefs.setBool('isStudent', true);
}

// 데이터 불러오기
Future<void> loadData() async {
  final prefs = await SharedPreferences.getInstance();
  final String? username = prefs.getString('username');
  final int? age = prefs.getInt('age');
  final bool? isStudent = prefs.getBool('isStudent');

  print('Username: $username');
  print('Age: $age');
  print('Is Student: $isStudent');
}

코드 설명:

  1. SharedPreferences.getInstance(): 이 메서드는 SharedPreferences의 인스턴스를 가져옵니다. ‘await’를 사용하는 이유는 이 작업이 비동기적으로 수행되기 때문입니다.
  2. prefs.setString(), prefs.setInt(), prefs.setBool(): 이 메서드들은 각각 문자열, 정수, 불리언 값을 저장합니다. 첫 번째 인자는 키(key)이고, 두 번째 인자는 저장할 값입니다.
  3. prefs.getString(), prefs.getInt(), prefs.getBool(): 이 메서드들은 저장된 값을 불러옵니다. 키를 인자로 받아 해당하는 값을 반환합니다.
  4. String?, int?, bool?: 여기서 ‘?’는 null 안전성을 위한 것입니다. 저장된 값이 없을 경우 null을 반환할 수 있음을 의미합니다.

4. SQLite 데이터베이스 사용하기

SQLite는 더 복잡하고 구조화된 데이터를 저장하는 데 적합합니다.

4.1 sqflite 패키지 설치

pubspec.yaml 파일에 다음 의존성을 추가합니다:

dependencies:
  sqflite: ^2.0.0+4
  path: ^1.8.0

그리고 터미널에서 다음 명령을 실행합니다:

flutter pub get

4.2 SQLite 데이터베이스 사용 예제

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

class DatabaseHelper {
  static final DatabaseHelper instance = DatabaseHelper._init();
  static Database? _database;

  DatabaseHelper._init();

  Future<Database> get database async {
    if (_database != null) return _database!;
    _database = await _initDB('todo.db');
    return _database!;
  }

  Future<Database> _initDB(String filePath) async {
    final dbPath = await getDatabasesPath();
    final path = join(dbPath, filePath);
    return await openDatabase(path, version: 1, onCreate: _createDB);
  }

  Future _createDB(Database db, int version) async {
    await db.execute('''
      CREATE TABLE todos(
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        title TEXT,
        completed INTEGER
      )
    ''');
  }

  Future<int> insertTodo(Map<String, dynamic> todo) async {
    final db = await instance.database;
    return await db.insert('todos', todo);
  }

  Future<List<Map<String, dynamic>>> getTodos() async {
    final db = await instance.database;
    return await db.query('todos');
  }
}

// 사용 예시
void main() async {
  // Todo 추가
  await DatabaseHelper.instance.insertTodo({
    'title': 'Flutter 공부하기',
    'completed': 0
  });

  // Todos 가져오기
  final todos = await DatabaseHelper.instance.getTodos();
  print(todos);
}

코드 설명:

  1. DatabaseHelper: 이 클래스는 데이터베이스 작업을 관리합니다. 싱글톤 패턴을 사용하여 하나의 인스턴스만 생성되도록 합니다.
  2. _initDB(): 이 메서드는 데이터베이스 파일을 생성하거나 열어 데이터베이스 인스턴스를 반환합니다.
  3. _createDB(): 이 메서드는 데이터베이스가 처음 생성될 때 호출되며, ‘todos’ 테이블을 생성합니다.
  4. insertTodo(): 이 메서드는 새로운 todo 항목을 데이터베이스에 삽입합니다. db.insert()는 삽입된 행의 id를 반환합니다.
  5. getTodos(): 이 메서드는 모든 todo 항목을 데이터베이스에서 가져옵니다. db.query()는 테이블의 모든 행을 반환합니다.
  6. Map<String, dynamic>: 이는 키가 문자열이고 값이 어떤 타입이든 될 수 있는 맵을 의미합니다. SQLite에서는 데이터를 이러한 형태로 주고받습니다.

5. 데이터 지속성 구현 시 주의사항

  1. 민감한 정보는 암호화하여 저장하세요.
  2. 대용량 데이터는 파일 시스템을 이용하는 것이 좋습니다.
  3. 네트워크 연결이 필요한 데이터는 로컬 저장소와 동기화 로직을 구현해야 합니다.

6. 마치며

이렇게 Flutter에서 데이터 지속성을 구현하는 방법에 대해 알아보았습니다. SharedPreferences는 간단한 데이터에, SQLite는 더 복잡한 데이터 구조에 적합합니다. 여러분의 앱 요구사항에 맞는 방법을 선택하여 사용하시기 바랍니다.

코드를 이해하는 데 어려움이 있다면, 주저하지 말고 질문해주세요. Flutter 개발 시리즈를 마치며, 여러분의 앱 개발 여정에 행운이 함께하기를 바랍니다!

7. 관련 리소스

Flutter에서의 데이터 지속성에 대해 더 자세히 알아보고 싶다면, 다음 리소스들을 참고해보세요:

7-1. 공식 문서:

7-2. 튜토리얼 및 가이드:

7-3. 비디오 자료:

이 리소스들을 통해 Flutter에서의 데이터 지속성에 대해 더 깊이 있게 학습할 수 있습니다. 공식 문서는 가장 신뢰할 수 있는 정보를 제공하며, 튜토리얼과 비디오 자료는 실제 구현 방법을 시각적으로 보여줍니다. 블로그 포스트는 개발자들의 실제 경험을 공유하며, 커뮤니티 리소스를 통해 다른 개발자들과 소통하고 도움을 받을 수 있습니다.

8. 마치며

Flutter에서 데이터 지속성을 구현하는 방법에 대해 알아보았습니다. SharedPreferences는 간단한 데이터에, SQLite는 더 복잡한 데이터 구조에 적합합니다. 여러분의 앱 요구사항에 맞는 방법을 선택하여 사용하시기 바랍니다.

이 포스팅과 함께 제공된 관련 리소스를 활용하여 Flutter 개발 실력을 더욱 향상시키세요. 질문이나 피드백이 있다면 언제든 댓글로 남겨주세요. Flutter 개발 여정에 행운이 함께하기를 바랍니다!

관련 포스팅

Flutter 개발-2: 프로젝트 생성 및 구조 파악 – CSAI

Flutter 개발-3: To-Do 리스트 앱 UI 구현하기 – CSAI

Flutter 개발-4: 앱 상태 관리 추가하기 – CSAI

Flutter 개발-5: 로컬 저장소 추가 – CSAI

Flutter 개발-6: 앱 UI 개선 및 기능 확장 – CSAI

Flutter-7: Provider 라이브러리활용하기 – CSAI

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다