[flutter] Firebase Firestore를 사용한 투표 시스템 구현하기

Firebase Firestore는 실시간 데이터베이스 서비스로서, Flutter 앱에서 강력한 데이터 저장 및 동기화 솔루션을 제공합니다. 이번 튜토리얼에서는 Flutter와 Firebase Firestore를 사용하여 투표 시스템을 구현하는 방법을 알아보겠습니다.

준비물

Firebase Firestore 설정

  1. Firebase 콘솔에 로그인하고, 새 프로젝트를 생성합니다.
  2. 생성한 프로젝트에 Firebase Firestore를 활성화합니다.
  3. 프로젝트의 “프로젝트 설정”으로 이동하여 “서비스 계정” 탭에서 새 비공개 키를 생성합니다. 다운로드한 JSON 파일은 안전한 곳에 보관합니다.

Flutter 프로젝트 설정

  1. Flutter 프로젝트를 생성합니다.
  2. pubspec.yaml 파일에 cloud_firestore 패키지를 추가합니다:

    dependencies:
      flutter:
        sdk: flutter
      cloud_firestore: ^2.4.0
    
  3. 패키지를 가져오기 위해 터미널에서 flutter pub get 명령을 실행합니다.

Firebase 인증

Firebase Firestore에 액세스하기 위해 Firebase 인증이 필요합니다. Firebase 프로젝트에 앱을 추가하고, Firebase 인증을 설정해야 합니다.

Firestore 데이터 모델링

우리의 투표 시스템은 polls 컬렉션과 votes 컬렉션으로 구성될 것입니다. polls 컬렉션에는 각 투표의 정보가 들어있고, votes 컬렉션은 사용자의 투표 정보를 저장합니다. votes 컬렉션은 poll_id 필드로 polls 컬렉션과 연결되어 있습니다.

Flutter 앱에서 Firebase Firestore 사용

  1. main.dart 파일에서 Firebase Firestore를 초기화합니다.

    import 'package:firebase_core/firebase_core.dart';
    import 'package:cloud_firestore/cloud_firestore.dart';
    
    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await Firebase.initializeApp();
      runApp(MyApp());
    }
    
  2. 앱에서 Firebase Firestore에 연결합니다.

    FirebaseFirestore firestore = FirebaseFirestore.instance;
    
  3. 투표 정보를 가져오는 예시 코드:

    CollectionReference polls = firestore.collection('polls');
    
    Future<void> getPolls() async {
      try {
        await polls.get().then((querySnapshot) => {
          querySnapshot.docs.forEach((doc) {
            print(doc.data());
          })
        });
      } catch(e) {
        print(e.toString());
      }
    }
    
  4. 사용자의 투표 정보를 저장하는 예시 코드:

    CollectionReference votes = firestore.collection('votes');
    
    Future<void> saveVote(String pollId, String userId, String choice) {
      return votes.doc(userId).set({
        'poll_id': pollId,
        'choice': choice
      });
    }
    
  5. Firestore에서 실시간 업데이트를 받는 예시 코드:

    Stream<QuerySnapshot> getPollResults(String pollId) {
      return votes.where('poll_id', isEqualTo: pollId).snapshots();
    }
    

이제 Firebase Firestore를 사용하여 투표 시스템을 구현할 준비가 되었습니다. Flutter와 Firebase의 강력한 조합으로 원활한 데이터 동기화를 경험해보세요!

더 많은 Firebase Firestore 기능과 사용 방법에 대해서는 Firebase Firestore 공식 문서를 참고하세요.