[flutter] Firebase Firestore와 플러터를 이용한 음식 주문 애플리케이션 만들기

개요

이번 블로그 포스트에서는 Firebase Firestore와 플러터(Flutter)를 사용하여 음식 주문 애플리케이션을 개발하는 방법에 대해 알아보겠습니다. Firebase Firestore는 실시간 데이터베이스로서, 실시간으로 데이터를 동기화하고 고성능의 데이터 쿼리를 제공합니다. 플러터는 Google에서 개발한 크로스 플랫폼 프레임워크로서, 단일 코드베이스로 안드로이드 및 iOS 애플리케이션을 개발할 수 있습니다.

프로젝트 설정

  1. Firebase 프로젝트 생성 및 Firestore 설정
    • Firebase 콘솔에 로그인하고 새 프로젝트를 생성합니다.
    • 프로젝트 설정에서 Firestore Database를 선택하고 데이터베이스를 생성합니다.
  2. 플러터 프로젝트 생성
    • Flutter SDK를 설치하고 Flutter 프로젝트를 생성합니다.
      flutter create food_order_app
      
  3. Firebase 연동
    • pubspec.yaml 파일에 firebase_corecloud_firestore 라이브러리를 추가합니다.
      dependencies:
      flutter:
        sdk: flutter
      firebase_core: ^1.0.0
      cloud_firestore: ^2.2.0
      
  4. Firebase 설정 파일 추가
    • Firebase 콘솔에서 “GoogleService-Info.plist” 파일(iOS) 또는 “google-services.json” 파일(Android)을 다운로드하고, 프로젝트의 ios 또는 android 폴더에 복사합니다.

주문 데이터 모델링

Firestore에서 음식 주문을 저장하기 위한 데이터 모델을 정의해보겠습니다. 음식 주문은 주문 ID, 사용자 ID, 음식 목록과 수량, 주문 날짜 및 시간으로 구성됩니다.

class Order {
  final String id;
  final String userId;
  final List<Food> foods;
  final DateTime timestamp;

  Order({
    required this.id,
    required this.userId,
    required this.foods,
    required this.timestamp,
  });
}

class Food {
  final String name;
  final int quantity;

  Food({
    required this.name,
    required this.quantity,
  });
}

주문 추가하기

이제 사용자가 주문을 추가하는 기능을 구현해보겠습니다.

import 'package:cloud_firestore/cloud_firestore.dart';

void addOrder(Order order) {
  FirebaseFirestore.instance.collection('orders').add({
    'id': order.id,
    'userId': order.userId,
    'foods': order.foods.map((food) => {
      'name': food.name,
      'quantity': food.quantity,
    }).toList(),
    'timestamp': order.timestamp,
  });
}

위 코드에서는 FirebaseFirestore.instance.collection('orders').add()를 사용하여 주문 데이터를 Firestore에 추가합니다. order 객체의 각 속성을 매핑하여 데이터를 저장합니다.

주문 조회하기

이제 사용자가 주문 목록을 조회할 수 있는 기능을 추가해보겠습니다.

import 'package:cloud_firestore/cloud_firestore.dart';

Stream<List<Order>> getOrderList(String userId) {
  return FirebaseFirestore.instance
      .collection('orders')
      .where('userId', isEqualTo: userId)
      .orderBy('timestamp', descending: true)
      .snapshots()
      .map((QuerySnapshot snapshot) => snapshot.docs.map((DocumentSnapshot doc) {
            final List<dynamic> foods = doc['foods'];
            final List<Food> foodList = foods
                .map((food) => Food(
                      name: food['name'],
                      quantity: food['quantity'],
                    ))
                .toList();

            return Order(
              id: doc['id'],
              userId: doc['userId'],
              foods: foodList,
              timestamp: doc['timestamp'].toDate(),
            );
          }).toList());
}

위 코드에서는 FirebaseFirestore.instance.collection('orders').where().orderBy().snapshots()를 사용하여 주문 목록을 조회합니다. userId를 기준으로 주문을 필터링하고, timestamp를 기준으로 내림차순으로 정렬합니다. 조회된 주문 데이터를 Order 객체로 변환하여 Stream<List<Order>> 형태로 반환합니다.

마무리

이번 블로그 포스트에서는 Firebase Firestore와 플러터를 사용하여 음식 주문 애플리케이션을 개발하는 방법에 대해 알아보았습니다. Firebase Firestore를 활용하면 실시간 데이터베이스를 효율적으로 이용할 수 있고, 플러터를 사용하면 안드로이드 및 iOS에서 동작하는 애플리케이션을 한 번에 개발할 수 있습니다. 음식 주문 애플리케이션을 만들어보면서 Firebase Firestore와 플러터의 강력한 기능과 연동성을 경험해보시기 바랍니다.

참고 자료