내부 저장소 이용하기
플러터에서 앱의 데이터를 저장하는 방법은 크게 3가지로 나뉜다.
1. 공유 환경설정
2. 파일
3. 데이터베이스 이용
1. 공유 환경설정에 데이터 저장하기
- 공유 환경설정은 비교적 적은 양의 간단한 데이터를 저장하는 용도로, Shared Preferences라는 클래스를 이용한다.
이 클래스는 키-값 쌍으로 구성된 공유 환경설정 파일을 가리키며 이 파일에 데이터를 읽거나 쓰는 함수를 제공한다.
- SharedPreferences 클래스를 이용하여 데이터를 저장하는 앱을 만들어 보겠다.
데모 앱의 카운트값 저장하기
- 기본으로 만들어지는 데모 앱에서 플로팅 버튼을 누르면 증가하는 카운트값을 고유 환경설정에 저장해보겠다.
- 데모 앱은 오른쪽 아래 + 모양의 플로팅 버튼이 있고 이 버튼을 누르면 화면의 카운트 값이 증가한다.
이 카운트 값이 증가된 상태에서 앱을 종료하고 다시 실행하면 데이터를 저장하지 않았기 때문에 숫자가 0으로 초기화된다.
이 카운트 값을 공유 환경설정에 저장해서 앱을 종료해도 숫자가 초기화되지 않도록 해보았다.
데이터를 공유 환경설정에 저장하는 SharedPreferences 클래스를 플러터에서 사용하려면
shared_preferences라는 패키지를 이용한다. (shared_preferences : 2.0.6)
- MyHomePageState 클래스에 카운트값을 저장하는 함수 _setData()와 가져오는 함수 _loadData()를 만든 후
이 함수들은 언제 처리를 완료할지 예측할 수 없으므로 async를 이용해 비동기 함수로 만든다.
- 공유 환경설정에서 저장하는 데이터는 키-값 쌍으로 구성되어야 한다. 이때 키는 중복되지 않는 고유한 값이어야한다.
공유 환경설정에 저장할 수 있는 값의 유형에는 int, String, bool, double, StringList 등이 있다.
- _setData() 함수에서 'count' 라는 키값을 지정한 key 변수를 선언하였다. SharedPreferences 클래스의 인스턴스를 생성한 후 Key와 카운트 값 value를 인자로 setInt()함수를 호출하였다. setInt() 함수는 SharedPreferences 클래스가 제공하는 *세터 함수이다.
count라는 키에 대응하는 카운트 값을 공유 환경설정에 저장한다.
* 세터(setter)는 데이터를 저장하는 역할을 하는 함수를 의미한다.
- 공유 환경설정에 저장된 데이터를 가져오는 코드는 _loadData()함수에 작성하였다. SharedPreferences 클래스의 인스턴스를 생성한 후 이를 통해 getInt()라는 *게터 함수를 호출한다. 데이터를 찾기 위해 key를 인자로 넣는다. 가져온 데이터가 null이 아니면 카운트값을 나타내는 _counter를 변수에 넣는다.
* 게터(getter)는 데이터를 불러오는 역할을 하는 함수를 의미한다.
- 카운트값을 가져오는 _loadData() 함수는 앱이 처음 실행될 때 호출하도록 initState() 함수에 넣고,
카운트 값을 저장하는 _setData() 함수는 버튼을 누를 때마다 호출되는 _incrementCounter() 함수에서 카운트 값을 증가하는 _counter++ 값 뒤에 넣는다.
- 숫자를 증가시키고 앱을 종료했다가 다시 실행해보면 증가한 숫자가 그대로 보이는 것을 확인 할 수 있다.
- 공유 환경설정을 이용하는 것도 결국 내부 저장소에 파일 형태로 데이터를 저장하는 것이지만, 공유 환경설정 파일은 앱에서만 접근할 수 있는 특수한 목적의 데이터 저장소라는 점에 차이가 있다.
2. 파일에 데이터 저장하기
- 파일을 이용하면 앞에서 살펴본 공유 환경설정보다 더 복잡하고 다양한 데이터를 다룰 수 있다. JPG나 비트맵 같은 이미지, MP3. MP4 같은 음성, 동영상, 그리고 긴 텍스트도 저장하고 불러 올 수 있다.
- 파일 입출력을 돕는 path_provider 패키지(path_provider: ^2.0.2)를 등록한 후 StatefulWidget을 상속받는 FileApp클래스를 작성한다.
- 파일 입출력 또한 환경에 따라 작업이 언제 끝날지 예측할 수 없으므로 async를 이용해 비동기 함수로 만든다.
path_provider 패키지에 들어 있는 getApplicationDocumentsDirectory() 함수를 이용해 내부 저장소의 경로를 가져와서 그곳에 파일을 읽거나 쓴다.
- writeCountFile() 함수는 매개변수로 전달받은 count값을 count.txt라는 이름의 파일로 만들어 문자열 형태로 저장하고, readCountFile() 함수는 이 파일을 읽어 다시 정수형으로 변환한 후 _count 변수에 저장한다. 그리고 앱이 실행될 때 파일에서 가져온 데이터를 표시하기 위해 initState() 함수에서 readCountFile() 함수를 호출한다.
- 임시 디렉토리 이용하는 방법
내부 저장소의 경로를 가져올 때 getApplicationDocumentsDirecctory() 함수 외에 getTemporaryDirectory() 함수를 이용할 수도 있다. 이 함수는 임시 디렉터리 경로로 가져오지만, 임시 디렉터리는 캐시(cache)를 이용하므로 앱이 종료되고 일정 시간이 지나면 사라질 수 있다.
- 텍스트 위젯에 카운트값을 넣고 플로팅 버튼을 누를 때마다 증가한다. 증가한 카운트값을 파일에 저장하도록 writeCountFile() 함수를 호출한다.
- 마지막으로 main.dart에 파일을 import하고 home값을 FileApp클래스로 수정한다.
- 플로팅 버튼을 눌러 카운트 값을 증가시키고 앱을 종료한 뒤 다시 실행시켜도 카운트 값이 초기화되지 않고 누적되는 것을 확인 할 수 잇다.