[TIL] Trouble Shooting

김영광·2026년 1월 14일

riverpod 과제를 마쳤다.
주말까지 투자해가며, 학습에 열중했기에 더더욱 뿌듯했다.
끝나고 나니 어려운 부분은 없었지만, 중간중간에 코드의 질에 대해 많은 생각을 했던 과제였다.
어려움을 겪거나 궁금했던 부분을 다시 한번 기록해보려고 한다

🔎 FutureOr<T>

Future, 비동기 작업을 수행할 때 사용한다.
미래에 꼭 T 데이터 타입의 값을 받아오겠다는 약속을 정의해둔 것이다.
일회성으로 매번 받아와야 한다는 점에서 Stream과는 차이가 있다.

그럼 FutureOr은 어떤 역할일까? Future와 차이가 있을까?
FutureOr은 비동기와 동기 작업 모두 뱉어낼 수 있다.
즉, return 값이 정확하게 정해지지 않았을 때나 return 값에 분기 처리가 되어 어떠한 값을 뱉어낼 지 모르는 상황일 때 사용한다.

🔎 Freezed

part 'to_do_entity.freezed.dart'; //freezed part
part 'to_do_entity.g.dart'; // jsonGenerator part


abstract class ToDoEntity with _$ToDoEntity {
  const factory ToDoEntity({
    required String id,
    required String title,
    String? des,
    (name: "is_favorite") required bool isFavorite,
    (name: "is_done") required bool isDone,
  }) = _ToDoEntity;

  factory ToDoEntity.fromJson(Map<String, dynamic> json) =>
      _$ToDoEntityFromJson(json);
}

Freezed 라이브러리를 사용해 Entity를 정의했다.
abstract class나 sealed class로 정의할 수 있으며, 각각의 class의 특징은 유지된다.

웬만한 DTO는 전부 abstract class로 작성되는데, with 뒤에 꼭 _$class명을 작성해줘야 한다.
단순 freezed로 model을 정의할 때는 freezed part만 선언해주면 된다.
formJson이나 toJson처럼 json_serialization 기능이 필요할 때는 g part까지 선언해줘야 한다.

🔎 Firebase 연동

이번 Todo App 프로젝트에서는 Firebase의 FireStore DB를 사용했다.
FireStore는 noSQL기반의 실시간DB로 지속적으로 데이터를 읽고 쓸 수 있다.
컬렉션이라는 테이블 안에 문서라는 튜플을 집어넣는다고 생각하면 편하게 이해할 수 있다.

  cloud_firestore: ^6.1.1
  firebase_core: ^4.3.0  

Firbase를 사용하기 위해서는 두 가지 라이브러리를 가져와야 한다.
주로 CRUD 작업을 하는데, 데이터를 읽고 쓰고 수정하고 삭제하는 작업이다.

collection에 접근하려고 하면 QueryDocumentSnapshots와 QuertySnapshots을 자주 볼 수 있는데, 각각 문서들의 정보를 담고 있는 객체이다.

📖 QuerySnapshot

document들의 정보를 담고 있다.
.docs를 통해 document가 담긴 리스트를 가져올 수 있다.
추가적으로 .size 메서드를 통해 List의 길이를 바로 반환할 수 있고, .metadata를 통해 데이터의 출처를 알 수 있다.

📖 QueryDocumentSnapshot

특정 Document 하나의 상태를 가지고 있는 객체이다.
ID 값을 입력해 하나의 문서를 요청했을 때만 반환된다.
.data()는 String 데이터를 Map 형태로 받아올 수 있고, .id를 통해 문서 자체의 id를 얻어올 수도 있다.

Google의 산물 Gemini는 다음과 같이 정리해주고 있다.

profile
주니어 개발자

0개의 댓글