App 내에서 정보를 기록하는 방식에 대해 알아보고 실제 예제를 통해 저장해보자!

koeyhoyh·2022년 7월 6일
1

App_Flutter

목록 보기
11/19

목표 : 앱을 이용해 내 핸드폰의 위치정보를 계속해서 (background) 로 저장할 예정이다. 그 전에 먼저, 기록을 추가하고, 읽을 수 있는 앱을 만들어 볼 것이다.

만들고 싶은 앱의 청사진.


먼저, 앱에 정보를 저장하기 위해서는??

보통
File, DB, SharedPreferences의 방법을 사용할 수 있다.

간단히 장점과 단점을 정리해놓았다.

SharedPreferences : 소규모, key-value 구조의 자료를 저장할 때 (python dict와 비슷함))

File :

장점 :
SharedPreferences 보다 더 복잡한 데이터를 다룰 수 있다.
Document Directory : 해당 앱만을 위한 저장공간
Temporary Directory : 임시 저장공간(캐시같은), 앱을 종료하면 사라질 수 있음.
비용이 거의 들지 않고 사용할 수 있다.

단점 :
여러 사용자가 있을 경우.
데이터 간 불일치가 일어날 수 있다. (실시간 + 여러 사용자가 함께 사용하기 힘들다.)
다수 사용자를 위해서 동시성 제어가 불가능하다.
데이터 독립성이 없어 유지보수 비용이 크다.
데이터 공유가 어렵다.
데이터 복구가 힘들다.
보안 기능을 제공하기 힘들다.

DB : 파일 시스템의 단점을 해결하고자 만들어졌다.

장점 : 파일 시스템의 단점 해결

단점 :
파일 방식보다 더 많은 하드웨어 자원 필요하다.

  • 데이터베이스의 일관성 유지하려면 컴퓨터 자원이 필요하다.
  • 파일 방식을 사용할 때보다 그냥 DB 시스템의 소프트웨어 규모가 크다.

DBMS 구입 비용, 유지보수 비용이 필요하다.

참고 : SharedPreferences, file로 저장하기
파일 vs DB
https://flutter-ko.dev/docs/cookbook/persistence/reading-writing-files


내가 선택한 방식은?

내가 선택한 방식은 file 방식이다.

내 위치정보는 내가 가지고 있으면서, 제공받은 위치정보만을 이용해 내 동선이 겹쳐져 있는지 확인한다면 위치정보가 유출될 염려가 없다. 그리고 내가 위치정보를 제공하고 싶다면 그 때 나의 동선 정보를 제공하면 된다.

파일을 이용하면 위에서 말한대로 해당 파일을 위한 영구적인 저장공간과 캐시등을 저장하기 위한 일시적인 저장공간이 있는데, 시스템은 자동으로 해당 위치에 access 하는 것을 철저히 막는다. 그리고, 해당 위치는 암호화되어있다.

이와 같은 특성으로 인해서, 앱 자체에서만 접근할 수 있는 민감한 정보를 저장하기 좋다고 한다.

민감한 정보, 즉 다른 앱에서 액세스해서는 안 되는 데이터를 저장할 때는 내부 저장소, 환경설정 또는 데이터베이스를 사용합니다. 내부 저장소를 사용하면 사용자에게 데이터가 숨겨진다는 추가적인 이점이 있습니다.

참고 : https://developer.android.com/training/data-storage/app-specific?hl=ko


해당 예제의 앱을 만들기 위해서는?

"기록" 화면에서 제목과 내용을 입력하고 (완료) 버튼을 누르면 "조회" 화면에서 기록된 글을 볼 수 있다.

1. 기록 화면

1-1. 제목, 내용을 입력받을 수 있는 위젯
1-2. 완료 버튼 위젯
-> 저장 기능

2. 조회 화면

2-0. 입력된 내용이 없다면 "글이 없습니다." 라는 문구가 있었으면 좋겠다. (필수 X)
2-1. 입력된 내용 하나 당 텍스트박스 하나가 보여야 한다.
2-1-1. 제목은 상단에 큰 폰트,
2-1-2. 내용은 하단에 작은 폰트 적용하기

3. 기록-조회 화면을 넘나들 수 있는 Navigation bar 하나

내용을 저장하고, 그 내용을 다른 화면에 다시 불러올 수 있는가 가 핵심이라고 생각한다.


궁금한 점

Navigation bar는 스택을 이용해 만들어서 화면이 뒤에 출력되게 만들 것이다.
그렇다면 화면당 Navigation bar를 하나씩 적용해서 만들어야 하는가?
아니면 하나만 만들어 둘 다 적용시킬 수 있는 방법이 있는가?

있다면 어떤 장점과 단점이 있는가?


먼저 생각한 점

TextBox와 Navigation bar를 여러 개 사용해야 하므로 class로 만들어주었다.
(Flutter : 재사용 가능한 위젯 만들어보기! 참고)

https://docs.flutter.dev/cookbook/persistence/reading-writing-files

Future와 async, await을 정리한 글. 도움이 많이 되었다.
https://velog.io/@jintak0401/FlutterDart-%EC%97%90%EC%84%9C%EC%9D%98-Future-asyncawait


하다보니 막힌 점.

파일이 저장은 되는데, 저장된 파일을 잘 읽어오지 못했다.

-> 결론은 저장된 파일을 잘 읽어오지 못하는 것이 아니라, 상태관리가 필요한 시점이었다.
textbox안에 text를 불러오는 함수를 넣어놓았었는데, 해당 함수로는 계속해서 에러만 출력했다. 문제는 initState()에 해당 함수들을 넣어주니 바로 해결되었다.

--> 2번째 페이지에서 initState()로 값을 불러오는 함수를 적어주지 않고, 그냥 textbox에 값을 읽어들이는 함수만 적어놓았을 때 해당 에러가 발생했다.

파일을 여러 개 만드는 것은 비효율적이라고 생각해서,

'\n' (개행 문자)를 이용해 한 줄씩 읽고 위젯으로 만들어줘야 하는데, Future<String> 타입으로 읽고 있던 나는 FutureBuilder로 위젯을 만들어주고 있었다.

어떻게 하면 여러 개의 위젯을 만들 수 있을까??

첫 번째 생각해낸 방법.
한 줄씩 읽어 배열에 저장하고 배열에 저장된 값을 반복문을 이용해 위젯 배열에 저장한다. 그리고, ListView를 이용해 출력한다.

파일 한 줄씩 읽기 참고 : https://stackoverflow.com/questions/21813401/reading-file-line-by-line-in-dart


profile
내가 만들어낸 것들로 세계에 많은 가치를 창출해내고 싶어요.

0개의 댓글