Today I Learned 4회차 - Firebase 연동

2 분 소요

🔥 Firebase 연동

4-1 Firebase Firestore란? 🤔

Firebase

  • Google에서 제공하는 모바일 및 웹 어플리케이션 개발 플랫폼
  • 서버를 직접 구축하지 않아도 로그인, 데이터 저장, 알람 등을 손쉽게 구현할 수 있는 클라우드 백엔드 서비스

Firestore

  • 클라우드 기반 NoSQL 데이터 베이스
  • 앱에서 생성되는 데이터를 실시간으로 저장하고 동기화할 수 있게 해줌

기존 데이터베이스 방식

열(column)이 정해져 있어서 새로 추가하거나 누락된 값이 있으면 오류가 날 수 있어요.

NoSQL 방식 (Firestore 문서 구조)

문서마다 다른 속성을 자유롭게 저장할 수 있어서, 상황에 맞게 유연하게 데이터 구조 구성 가능!

문서: 1

{
	"할일": "플러터공부",
	"완료여부": "false"
}

문서: 2

{
	"할일": "운동하기",
	"완료여부": "false",
	"삭제일자": "2025-07-05",
	"삭제이유": "이미 건강함"
}

4-4. 투두앱 Firebase 세팅하기

  1. Firebase에서 새로운 프로젝트 생성
  2. flutterfire configure
  3. android, ios만 선택 후 엔터
  4. flutter pub add firebase_core cloud_firestore

4-5. Firestore 사용법 정리

메모앱에 필요한 데이터를 파일로 저장한다고 했을 때

  • 할일 단위로 1개의 파일을 생성하고
  • 그 파일들을 1개의 폴더에 모아서 정리
  • 즉, 할일 목록 전체 = 폴더, 각 할 일 = 파일
    • 각 파일마다 고유한 이름(ID)를 만들어야 함
  • Firestore의 구조를 컴퓨터 안의 폴더와 파일처럼 생각하면 이해하기 쉬워요!
    • 하나의 컬랙션(Collection) = 하나의 폴더

Read

void loadTodos() async {
  // 컴퓨터 켜기 → 폴더 열기 → 전체 선택 후 실행
  // 파이어스토어 인스턴스 가지고오기 -> 컬렉션 참조 만들기 -> 가져오기
  final firestore = FirebaseFirestore.instance;
  final colRef = firestore.collection('todos');
  final querySnapshot = await colRef.get();
  final documents = querySnapshot.docs;
  List<Todo> newTodoList = [];
  for (var i = 0; i < documents.length; i++) {
    final data = documents[i].data();
    newTodoList.add(Todo(title: data['title'], isDone: data['isDone']));
  }

  setState(() {
    todoList = newTodoList;
  });
}

Create

void loadTodos() async {
  // 컴퓨터 켜기 → 폴더 열기 → 전체 선택 후 실행
  // 파이어스토어 인스턴스 가지고오기 -> 컬렉션 참조 만들기 -> 가져오기
  final firestore = FirebaseFirestore.instance;
  final colRef = firestore.collection('todos');
  // orderBy : CollectionReference 클래스의 메서드
  // createdAt 필드를 기준으로 내림차순 정렬된 쿼리를 생성함
  // 타입: Query<Map<String, dynamic>>
  // → 데이터를 정렬/필터링할 수 있는 Firestore 쿼리 객체
  final query = colRef.orderBy('createdAt', descending: true);
  final querySnapshot = await query.get();
  final documents = querySnapshot.docs;
  List<Todo> newTodoList = [];
  for (var i = 0; i < documents.length; i++) {
    final data = documents[i].data();
    newTodoList.add(Todo(title: data['title'], isDone: data['isDone']));
  }

  setState(() {
    todoList = newTodoList;
  });
}

.toIso8601String()이란?

  • DateTime 객체를 문자열(String) 로 변환하는 메서드
  • 국제 표준 형식(ISO 8601)에 맞춰 변환
  • 2025-08-01T22:15:32.123456 T는 날짜와 시간을 구분해주는 구분자!

Delete

onLongPress: () async {
  final result = await showCupertinoDialog(
    ... 생략
  if (result) {
    // 컴퓨터 켜기 → 폴더 열기 → 하나의 파일 선택 → 삭제
    // Firestore 인스턴스 가지고오기 → 컬렉션 참조 만들기 → 특정ID의 문서 참조 만들기 → 삭제
    final firestore = FirebaseFirestore.instance;
    final colRef = firestore.collection('todos');
    final docRef = colRef.doc(item.id);
    await docRef.delete();
    loadTodos();
  }
},

Update

onTap: () async {
  // 컴퓨터 켜기 → 폴더 열기 → 하나의 파일 선택 → 내용 수정 후 저장
  // Firestore 인스턴스 가지고오기 → 컬렉션 참조 만들기 → 특정ID의 문서 참조 만들기 → 수정
  final firestore = FirebaseFirestore.instance;
  final colRef = firestore.collection('todos');
  final docRef = colRef.doc(item.id);
  await docRef.update({'isDone': !item.isDone});
  loadTodos();
},

🔐 구글 로그인 연동

5-1. 암호화 및 구글 로그인

대칭키 암호화

  • 하나의 공통 키로 암호화와 복호화를 모두 수행
  • 빠르지만, 키가 유출되면 모든 정보가 털릴 수 있음

비대칭키 암호화

  • 공개키(Public Key)로 암호화
  • 개인키(Private Key)로만 복호화 가능
  • 키가 쌍으로 존재하므로, 보안성이 더 높음

비대칭키를 활용한 전자서명

구글 로그인에서 비대칭 암호화 활용

댓글남기기