Skip to content

데이터베이스

Fireship 에서는 Realtime Database 를 사용합니다. 초기에는 Firestore 를 통해 (Fireship 의 전신인) FireFlutter 를 활발히 개발 및 사용하다가 2024년 초에 Realtime Database 로 충분히 잘 만들 수 있으며, 더 간결하고 빠르게 동작하는 패키지를 개발하자라는 생각에 Fireship 으로 패키지 명을 변경하고 Realtime Database 를 주로 사용하는 패키지를 개발하게 되었습니다.

데이터베이스 가이드라인

  • Firestore 대신 Realtime Database 를 사용하므로서
  • 데이터의 전체가 아닌 부분을 listen 할 수 있으며, 최소 단위의 데이터를 (DB 로 부터) 가져 올 수 있고,
  • 이로 인해 데이터를 보다 빠르게 가져와 화면에 보여 줄 수 있고,
  • 비용 절감의 효과를 가져 올 수 있다.

  • 데이터베이 경로에는 가능한 언더바(_) 대신 하이픈(-)을 사용한다.

  • 예를 들면, user_private 대신 user-private 을 사용한다.

데이터베이스 구조

  • 가능한 flat style 을 지향한다.
  • 가능한 하위 데이터 구조를 포함하지 않는다. 예를 들면, 글 노드 하위에 코멘트를 보관하지 않는다. 예를 들면,
  • /posts/<postId>/comments/... 와 같이 글 아래에 코멘트를 저장하지 하지 않고,
  • /posts/<postId> 에 글 저장, /comments/<postId>/... 에 코멘트을 하여 데이터 그룹을 분리한다.

데이터베이스 위젯

  • 데이터베이스를 사용하기 쉽게 위젯을 제공한다.

Value 위젯

Value 위젯은 Realtime Database 에 있는 정보를 실시간으로 화면에 보여준다. DB 에 있는 값을 화면에 보여줄 때에는 꼭 이 위젯을 사용하도록 한다.

path 에 DB 경로를 지정하면 builder 에 dynamic 타입으로 전달되어 온다. 만약 path 에 지정된 경로에 값이 없으면 null 값이 builder 로 전달된다.

DB 에 존재하는 값과 동일한 값을 initialData 에 주면 화면 깜빡거림을 현저하게 줄일 수 있다.

예제 1 - test/banana 노드 값을 화면에 보여준다.

Value(
  initialData: 'BANANA',
  path: 'test/banana',
  builder: (v) => Text(v.toString()),
),

예제 2 - 로그인 사용자의 전화번호를 화면에 보여준다.

Value(path: Path.phoneNumber, builder: (v) => Text(v ?? ''))

onLoading 에 loader 아이콘을 보여 줄 수도 있고, 기본 위젯을 보여주어 화면에 반짝임을 줄 일 수 있다.

Database(
  path: post.ref.child(Field.noOfLikes).path,
  builder: (no) => Text('좋아요${likeText(no)}'),
  onLoading: const Text('좋아요'),
),

Value.once 를 통해서, 화면에 한번만 값을 보여 줄 수 있다. 즉, 값이 계속 해서 수정되는 경우, 실시간으로 화면에 표시하는 것이 아니라, 처음 한번만 값을 가져와 화면에 보여주고 업데이트가 되어도 화면에 보여주지 않는다.

Value.once(
  initialData: 'BANANA',
  path: 'test/banana',
  builder: (v) => Text(v.toString()),
),

User Database

See user document.