본문 바로가기
프로그래밍/Flutter

[Flutter] 8. Flutter의 "데이터베이스 및 로컬 저장소"

by iwbap 2024. 6. 26.
728x90

Flutter 학습: 데이터베이스 및 로컬 저장소

Flutter 애플리케이션에서는 다양한 방법으로 데이터를 저장하고 관리할 수 있습니다. 이번 글에서는 로컬 저장소로 SharedPreferences를 사용하는 방법, SQLite 데이터베이스를 사용하는 방법, 그리고 Hive를 사용한 NoSQL 데이터베이스에 대해 알아보겠습니다.


1. 로컬 저장소: SharedPreferences 사용법

SharedPreferences는 간단한 키-값 쌍 데이터를 로컬에 저장하는 데 사용됩니다. 주로 사용자 설정이나 작은 데이터를 저장할 때 유용합니다.

 

SharedPreferences 설치: 먼저, pubspec.yaml 파일에 shared_preferences 패키지를 추가합니다.

[yaml]
 
dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.0.6
 
 

그리고 패키지를 설치합니다.

[sh]
 
flutter pub get
 
 

SharedPreferences 사용 예제: SharedPreferences를 사용하여 데이터를 저장하고 불러오는 간단한 예제를 작성해보겠습니다.

[dart]
 
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SharedPreferencesExample(),
    );
  }
}

class SharedPreferencesExample extends StatefulWidget {
  @override
  _SharedPreferencesExampleState createState() => _SharedPreferencesExampleState();
}

class _SharedPreferencesExampleState extends State<SharedPreferencesExample> {
  late SharedPreferences _prefs;
  int _counter = 0;

  @override
  void initState() {
    super.initState();
    _loadCounter();
  }

  _loadCounter() async {
    _prefs = await SharedPreferences.getInstance();
    setState(() {
      _counter = _prefs.getInt('counter') ?? 0;
    });
  }

  _incrementCounter() async {
    setState(() {
      _counter++;
    });
    await _prefs.setInt('counter', _counter);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SharedPreferences Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Counter: $_counter'),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _incrementCounter,
              child: Text('Increment Counter'),
            ),
          ],
        ),
      ),
    );
  }
}
 

위의 예제에서 SharedPreferences를 사용하여 counter 값을 로컬에 저장하고, 애플리케이션을 다시 실행할 때 값을 불러옵니다.


2. SQLite: sqflite 패키지를 사용한 SQLite 데이터베이스

SQLite는 로컬 데이터베이스를 관리할 수 있는 경량의 관계형 데이터베이스입니다. Flutter에서는 sqflite 패키지를 사용하여 SQLite 데이터베이스를 쉽게 사용할 수 있습니다.

 

sqflite 설치: 먼저, pubspec.yaml 파일에 sqflite와 path 패키지를 추가합니다.

[yaml]
 
dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0+3
  path: ^1.8.0
 
 

그리고 패키지를 설치합니다.

[sh]
 
flutter pub get
 
 

SQLite 사용 예제: SQLite 데이터베이스를 사용하여 데이터를 저장하고 불러오는 간단한 예제를 작성해보겠습니다.

[dart]
 
import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SqfliteExample(),
    );
  }
}

class SqfliteExample extends StatefulWidget {
  @override
  _SqfliteExampleState createState() => _SqfliteExampleState();
}

class _SqfliteExampleState extends State<SqfliteExample> {
  late Database _database;
  List<Map<String, dynamic>> _notes = [];

  @override
  void initState() {
    super.initState();
    _initDatabase();
  }

  _initDatabase() async {
    _database = await openDatabase(
      join(await getDatabasesPath(), 'notes.db'),
      onCreate: (db, version) {
        return db.execute(
          'CREATE TABLE notes(id INTEGER PRIMARY KEY, title TEXT)',
        );
      },
      version: 1,
    );
    _loadNotes();
  }

  _loadNotes() async {
    final List<Map<String, dynamic>> notes = await _database.query('notes');
    setState(() {
      _notes = notes;
    });
  }

  _addNote() async {
    await _database.insert(
      'notes',
      {'title': 'New Note'},
      conflictAlgorithm: ConflictAlgorithm.replace,
    );
    _loadNotes();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SQLite Example'),
      ),
      body: ListView.builder(
        itemCount: _notes.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(_notes[index]['title']),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _addNote,
        child: Icon(Icons.add),
      ),
    );
  }
}

위의 예제에서 sqflite 패키지를 사용하여 notes 테이블을 생성하고, 새로운 노트를 추가하고 불러옵니다.


3. Hive: NoSQL 데이터베이스 사용법

Hive는 빠르고 경량의 키-값 저장소로, Flutter 애플리케이션에서 NoSQL 데이터베이스를 쉽게 사용할 수 있습니다.

 

Hive 설치: 먼저, pubspec.yaml 파일에 hive와 hive_flutter 패키지를 추가합니다.

[yaml]
 
dependencies:
  flutter:
    sdk: flutter
  hive: ^2.0.4
  hive_flutter: ^1.1.0
 
 

그리고 패키지를 설치합니다.

[sh]
 
flutter pub get
 
 

Hive 초기화: Hive를 사용하기 위해서는 초기화 과정이 필요합니다. 이를 위해 main.dart 파일을 수정합니다.

[dart]
 
import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';

void main() async {
  await Hive.initFlutter();
  await Hive.openBox('myBox');
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HiveExample(),
    );
  }
}

class HiveExample extends StatefulWidget {
  @override
  _HiveExampleState createState() => _HiveExampleState();
}

class _HiveExampleState extends State<HiveExample> {
  final _myBox = Hive.box('myBox');

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Hive Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Value: ${_myBox.get('counter', defaultValue: 0)}'),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  _myBox.put('counter', _myBox.get('counter', defaultValue: 0) + 1);
                });
              },
              child: Text('Increment Counter'),
            ),
          ],
        ),
      ),
    );
  }
}
 

위의 예제에서 Hive를 초기화하고, myBox라는 저장소를 열어 데이터를 저장하고 불러옵니다.


이 글에서는 Flutter 애플리케이션에서 데이터를 저장하고 관리하는 다양한 방법에 대해 알아보았습니다. SharedPreferences를 사용하여 간단한 로컬 저장소를 관리하고, sqflite를 사용하여 SQLite 데이터베이스를 관리하며, Hive를 사용하여 NoSQL 데이터베이스를 관리할 수 있습니다. 이러한 기술을 활용하여 강력하고 효율적인 데이터 관리를 구현해보세요. Happy Coding!

728x90