[flutter] Firebase Firestore와 플러터를 이용한 의료 기록 애플리케이션 만들기

의료 기록을 관리하는 애플리케이션을 만들기 위해 Firebase Firestore와 플러터(Flutter)를 사용하는 방법을 알아보겠습니다. Firebase Firestore는 클라우드 기반의 NoSQL 데이터베이스로, 실시간 데이터 동기화 및 강력한 쿼리 기능을 제공합니다. 플러터는 Google에서 개발한 UI 프레임워크로, 다양한 플랫폼에서 동작하는 애플리케이션을 빠르게 개발할 수 있습니다.

필요한 기술 스택

1. Firebase 프로젝트 설정

  1. Firebase 콘솔(https://console.firebase.google.com)에 접속하여 프로젝트를 생성합니다.
  2. 생성한 프로젝트에 Firestore를 추가합니다.
  3. Firebase SDK 구성 파일(google-services.json 또는 GoogleService-Info.plist)을 다운로드하고 프로젝트에 추가합니다.

2. Flutter 프로젝트 설정

  1. Flutter SDK를 설치합니다. (https://flutter.dev)
  2. Flutter 프로젝트를 생성합니다. (예: flutter create medical_records_app)
  3. pubspec.yaml 파일에 Firebase 및 Firestore 관련 패키지를 추가합니다.
dependencies:
  flutter:
    sdk: flutter
  firebase_core: ^1.0.0
  cloud_firestore: ^2.5.0
  1. 패키지를 설치합니다. (flutter pub get 명령어 실행)

3. Firebase 초기화

Firebase를 초기화하여 응용 프로그램에 연결합니다. main.dart 파일의 main 함수에 다음 코드를 추가합니다.

import 'package:firebase_core/firebase_core.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

4. 데이터베이스 연결

Firestore 데이터베이스에 연결하고 데이터를 가져오거나 추가하는 방법을 알아봅시다.

import 'package:cloud_firestore/cloud_firestore.dart';

class MedicalRecordsService {
  final FirebaseFirestore _firestore = FirebaseFirestore.instance;
  final String collectionName = 'medical_records';

  Future<List<MedicalRecord>> getMedicalRecords() async {
    var snapshot = await _firestore.collection(collectionName).get();
    return snapshot.docs.map((doc) => MedicalRecord.fromSnapshot(doc)).toList();
  }

  Future<void> addMedicalRecord(MedicalRecord medicalRecord) async {
    await _firestore.collection(collectionName).add(medicalRecord.toMap());
  }
}

class MedicalRecord {
  final String name;
  final String diagnosis;

  MedicalRecord(this.name, this.diagnosis);

  Map<String, dynamic> toMap() {
    return {
      'name': name,
      'diagnosis': diagnosis,
    };
  }

  factory MedicalRecord.fromSnapshot(DocumentSnapshot snapshot) {
    var data = snapshot.data();
    return MedicalRecord(data['name'], data['diagnosis']);
  }
}

위 코드에서 MedicalRecordsService 클래스는 Firestore 데이터베이스와 통신하기 위한 기능을 제공합니다. getMedicalRecords 함수는 모든 의료 기록을 가져옵니다. addMedicalRecord 함수는 새로운 의료 기록을 추가합니다. MedicalRecord 클래스는 의료 기록 객체를 나타내며, toMap 함수를 통해 Firestore에 저장할 수 있는 형태로 변환합니다. fromSnapshot 함수는 Firestore에서 가져온 데이터를 MedicalRecord 객체로 변환합니다.

5. 플러터 화면 구성

의료 기록을 표시하고 추가하기 위한 플러터 화면을 구성해봅시다.

import 'package:flutter/material.dart';

class MedicalRecordsPage extends StatelessWidget {
  final MedicalRecordsService _medicalRecordsService = MedicalRecordsService();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('의료 기록'),
      ),
      body: FutureBuilder<List<MedicalRecord>>(
        future: _medicalRecordsService.getMedicalRecords(),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            if (snapshot.hasData) {
              return ListView.builder(
                itemCount: snapshot.data.length,
                itemBuilder: (context, index) {
                  var medicalRecord = snapshot.data[index];
                  return ListTile(
                    title: Text(medicalRecord.name),
                    subtitle: Text(medicalRecord.diagnosis),
                  );
                },
              );
            } else {
              return Text('데이터 없음');
            }
          } else {
            return CircularProgressIndicator();
          }
        },
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () {
          var newMedicalRecord = MedicalRecord('새로운 환자', '진단 내용');
          _medicalRecordsService.addMedicalRecord(newMedicalRecord);
        },
      ),
    );
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '의료 기록 앱',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: MedicalRecordsPage(),
    );
  }
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

위 코드는 플러터 앱의 화면을 구성하는 코드입니다. 기록된 의료 기록들을 화면에 표시하고, FloatingActionButton을 통해 새로운 의료 기록을 추가할 수 있습니다.

이제 Firebase Firestore와 플러터를 이용해 의료 기록 애플리케이션을 만들 수 있습니다. Firebase를 통해 실시간으로 데이터를 동기화하고 저장하며, 플러터를 사용하여 멋진 UI를 구성할 수 있습니다.