Today I Learned 4회차 - Firebase 연동
🔥 Firebase 연동
4-1 Firebase Firestore란? 🤔
Firebase
- Google에서 제공하는 모바일 및 웹 어플리케이션 개발 플랫폼
- 서버를 직접 구축하지 않아도 로그인, 데이터 저장, 알람 등을 손쉽게 구현할 수 있는 클라우드 백엔드 서비스
Firestore
- 클라우드 기반 NoSQL 데이터 베이스
- 앱에서 생성되는 데이터를 실시간으로 저장하고 동기화할 수 있게 해줌
기존 데이터베이스 방식
열(column)이 정해져 있어서 새로 추가하거나 누락된 값이 있으면 오류가 날 수 있어요.
NoSQL 방식 (Firestore 문서 구조)
문서마다 다른 속성을 자유롭게 저장할 수 있어서, 상황에 맞게 유연하게 데이터 구조 구성 가능!
문서: 1
{
"할일": "플러터공부",
"완료여부": "false"
}
문서: 2
{
"할일": "운동하기",
"완료여부": "false",
"삭제일자": "2025-07-05",
"삭제이유": "이미 건강함"
}
4-4. 투두앱 Firebase 세팅하기
- Firebase에서 새로운 프로젝트 생성
flutterfire configure
- android, ios만 선택 후 엔터
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)로만 복호화 가능
- 키가 쌍으로 존재하므로, 보안성이 더 높음
비대칭키를 활용한 전자서명
댓글남기기