[flutter] Firebase Database 내부에 데이터 구조 설계하기

Firebase Database는 실시간 데이터베이스로서, 앱의 데이터를 클라우드에 저장하고 동기화할 수 있는 기능을 제공합니다. 데이터 구조를 효율적으로 설계하는 것은 앱의 성능과 확장성에 중요한 역할을 합니다. 이번 포스트에서는 Firebase Database 내부에 데이터 구조를 설계하는 방법을 알아보겠습니다.

1. 데이터 모델링

Firebase Database 내부에 데이터를 저장할 때, 첫 번째로 고려해야 할 것은 데이터의 모델링입니다. 데이터 모델링은 데이터의 관계를 정의하고 데이터의 구조를 설계하는 과정입니다. Firebase Database는 JSON 형식의 데이터를 저장하기 때문에, 데이터 구조를 트리 모양으로 설계하는 것이 일반적입니다.

예를 들어, 우리가 블로그 앱을 만든다고 가정해보겠습니다. 블로그 포스트에는 제목, 작성자, 내용 등의 정보가 필요합니다. 또한, 댓글도 모델링해야 합니다. 이 경우, Firebase Database 내부에는 다음과 같은 구조를 설계할 수 있습니다.

- posts
  - post_id_1
    - title: "첫 번째 포스트"
    - author: "John Doe"
    - content: "안녕하세요, 첫 번째 포스트입니다."
  - post_id_2
    - title: "두 번째 포스트"
    - author: "Jane Smith"
    - content: "안녕하세요, 두 번째 포스트입니다."
- comments
  - post_id_1
    - comment_id_1
      - author: "Mike"
      - content: "좋은 포스트네요!"
    - comment_id_2
      - author: "Sarah"
      - content: "정말 유익한 내용입니다!"
  - post_id_2
    - comment_id_1
      - author: "Chris"
      - content: "잘 읽었습니다."

위의 예시에서는 포스트와 댓글을 각각 별도의 트리로 모델링하였습니다. 각 포스트와 댓글은 고유한 ID를 가지고 있으며, 해당 ID를 사용하여 데이터에 접근할 수 있습니다.

2. 데이터 읽고 쓰기

Firebase Database는 데이터를 읽고 쓰는 데에 사용할 수 있는 다양한 API를 제공합니다. Flutter에서 Firebase를 사용하여 데이터를 읽고 쓰는 방법을 알아봅시다.

데이터 읽기

Firebase Database에서 데이터를 읽기 위해서는 DatabaseReference를 사용합니다. 예를 들어, 모든 포스트를 읽어오는 코드는 다음과 같이 작성할 수 있습니다.

void fetchPosts() {
  DatabaseReference postsRef =
      FirebaseDatabase.instance.reference().child('posts');

  postsRef.once().then((DataSnapshot snapshot) {
    Map<dynamic, dynamic> posts = snapshot.value;
    
    // 읽어온 포스트 데이터를 처리하는 로직을 작성합니다.
  });
}

데이터 쓰기

Firebase Database에 데이터를 쓰기 위해서는 DatabaseReferenceset 메서드를 사용합니다. 예를 들어, 새로운 포스트를 추가하는 코드는 다음과 같이 작성할 수 있습니다.

void addPost(String title, String author, String content) {
  DatabaseReference postsRef =
      FirebaseDatabase.instance.reference().child('posts');

  DatabaseReference newPostRef = postsRef.push();
  newPostRef.set({
    'title': title,
    'author': author,
    'content': content,
  }).then((_) {
    // 새로운 포스트 추가 완료
  }).catchError((error) {
    // 에러 처리 로직 작성
  });
}

3. 데이터 동기화

Firebase Database는 실시간으로 데이터를 동기화하는 기능을 제공합니다. 데이터가 변경될 때마다 앱에서 이를 감지하여 자동으로 업데이트할 수 있습니다. 데이터 동기화를 위해서는 onValue 메서드를 사용합니다.

void syncPosts() {
  DatabaseReference postsRef =
      FirebaseDatabase.instance.reference().child('posts');

  postsRef.onValue.listen((DataSnapshot snapshot) {
    Map<dynamic, dynamic> posts = snapshot.value;
    
    // 데이터 변경 시 실행될 로직을 작성합니다.
  });
}

위의 코드는 posts 트리의 데이터를 실시간으로 감지하여 업데이트된 데이터를 받아옵니다. 이를 통해 앱은 항상 최신의 데이터를 보여줄 수 있습니다.

Firebase Database를 이용하여 데이터를 효율적으로 저장하고 관리하기 위해서는 데이터 구조를 잘 설계하는 것이 중요합니다. 데이터 모델링과 데이터 읽기/쓰기/동기화에 대한 기본 개념을 이해한 후, 본인의 앱에 맞는 데이터 구조를 설계하여 Firebase Database를 활용해보세요!