class ProductModel {
final String productId;
final String name;
// 기타 필드들...
ProductModel({
required this.productId,
required this.name,
// 기타 필드 초기화...
});
// Firestore의 DocumentSnapshot을 직접 받아 처리
factory ProductModel.fromFirestore(DocumentSnapshot doc) {
return ProductModel(
productId: doc.id, // Firestore 문서 ID
name: doc['name'], // Firestore 문서의 필드
// 기타 필드 초기화...
);
}
} ㅇ여기에서 class ProductModel {
final String productId;
final String name;
// 기타 필드들... 이것과 ProductModel({
required this.productId,
required this.name,
// 기타 필드 초기화...
}); 이것은 무슨 의미가 있어? 무슨 뜻이야?
1. 필드 선언: class ProductModel { final String productId; final String name; ... }
- 이 부분은 ProductModel 클래스가 어떤 데이터 필드를 포함하는지 정의하는 부분입니다.
- final String productId; final String name;은 각각 제품 ID와 제품 이름을 저장할 필드로, final 키워드를 사용하여 초기화 후 수정되지 않도록 설정하였습니다.
- final 키워드를 사용하면 ProductModel 객체가 생성될 때 값을 할당받은 후, 그 값이 변하지 않음을 보장합니다.
즉, productId와 name은 ProductModel의 데이터 속성으로, 객체를 통해 접근할 수 있는 변수들입니다.
2. 생성자: ProductModel({ required this.productId, required this.name, ... })
- 이 부분은 **생성자(Constructor)**로, ProductModel 클래스의 객체를 생성할 때 필드에 초기 값을 설정해주는 역할을 합니다.
- required this.productId, required this.name은 productId와 name 필드가 반드시 필요한 값임을 나타내며, 객체를 생성할 때 반드시 초기 값을 제공해야 한다는 뜻입니다.
- 예를 들어, ProductModel 객체를 생성할 때 다음과 같이 필드에 값을 제공해야 합니다.
- final product = ProductModel(productId: 'prod_123', name: '샘플 제품');
- 이렇게 생성된 product 객체는 productId와 name 값이 할당된 상태가 됩니다.
- 객체가 생성될 때 productId와 name 필드에 초기 값을 할당하여 초기화합니다.
- 객체가 생성된 후에는, final 키워드로 선언된 필드 값이 변경되지 않도록 보장합니다.
- 생성자가 하는 일
- 객체가 생성될 때 productId와 name 필드에 초기 값을 할당하여 초기화합니다.
- 객체가 생성된 후에는, final 키워드로 선언된 필드 값이 변경되지 않도록 보장합니다.
요약
- 필드 선언 (final String productId; final String name;): 클래스에 포함될 데이터 속성을 정의합니다.
- 생성자 (ProductModel({ required this.productId, required this.name });): 객체 생성 시 필드를 초기화하며, productId와 name을 반드시 할당해야 함을 명시합니다.
이 두 요소는 함께 ProductModel 객체의 구조와 초기 상태를 정의하며, 안정적이고 일관된 데이터 관리를 가능하게 합니다.
factory ProductModel.fromMap(Map<String, dynamic> map) { //TODO MAP 타입변환 // Timestamp를 DateTime으로 변환 Timestamp timestamp = map['registrationDate'] as Timestamp; DateTime date = timestamp.toDate(); 이거는 무슨 뜻이야?
이 코드는 factory ProductModel.fromMap(Map<String, dynamic> map)이라는 팩토리 생성자 안에서 Firestore에서 가져온 Map<String, dynamic> 타입 데이터를 ProductModel 객체로 변환하기 위해 사용하는 코드입니다. 이 생성자는 특히 registrationDate 필드의 타입 변환을 처리하는 부분을 포함하고 있습니다. 아래에서 각 부분을 설명하겠습니다.
factory ProductModel.fromMap(Map<String, dynamic> map) {
//TODO MAP 타입변환
// Timestamp를 DateTime으로 변환
Timestamp timestamp = map['registrationDate'] as Timestamp;
DateTime date = timestamp.toDate();
}
1. factory ProductModel.fromMap(Map<String, dynamic> map)
- 팩토리 생성자: ProductModel 객체를 생성하는 팩토리 생성자입니다. 이 생성자는 Map<String, dynamic> 데이터를 받아서 ProductModel 객체로 변환합니다.
- Map<String, dynamic> map: Firestore, JSON, 또는 다른 데이터 소스에서 온 데이터를 Map<String, dynamic> 형태로 전달받습니다. 이 map 객체에는 ProductModel의 각 필드가 키-값 쌍으로 저장되어 있습니다.
2. Timestamp를 DateTime으로 변환
Firestore에서 날짜와 시간을 다룰 때는 Timestamp라는 타입을 사용합니다. 하지만 Dart에서는 DateTime을 주로 사용하기 때문에, Timestamp 데이터를 DateTime 타입으로 변환해줘야 합니다.
Timestamp timestamp = map['registrationDate'] as Timestamp;
DateTime date = timestamp.toDate();
- map['registrationDate'] as Timestamp;: map에서 registrationDate라는 키를 통해 값을 가져옵니다. 이 값은 Firestore에서 온 데이터이기 때문에 Timestamp 타입일 가능성이 큽니다. 따라서, 이 값을 Timestamp로 캐스팅(as Timestamp)하여 사용합니다.
- timestamp.toDate(): Timestamp에는 toDate() 메서드가 있어서 이를 통해 Timestamp를 DateTime 타입으로 변환할 수 있습니다. 이렇게 변환된 DateTime 객체를 ProductModel의 registrationDate 필드에 할당할 수 있게 됩니다.
전체적인 의미
이 코드는 Firestore의 Timestamp를 Dart의 DateTime으로 변환하는 작업을 수행하여, ProductModel이 Firestore 데이터와 호환되도록 합니다. fromMap 생성자는 Firestore뿐 아니라 다른 소스에서도 데이터를 받을 수 있기 때문에, 이처럼 타입 변환이 필요한 경우에 추가적인 변환 처리가 필요할 수 있습니다.
예시
이 생성자를 사용하면 다음과 같은 방식으로 Map<String, dynamic> 데이터를 ProductModel 객체로 변환할 수 있습니다.
final Map<String, dynamic> mapData = {
'productId': 'prod_1',
'name': '샘플 제품',
'registrationDate': Timestamp.now(), // Firestore의 Timestamp 데이터
};
final product = ProductModel.fromMap(mapData);
이 예시에서 Timestamp.now()로 생성된 registrationDate가 DateTime으로 변환되어 ProductModel 객체에 저장됩니다.
'♠♠기술 구현' 카테고리의 다른 글
카테고리별 랭킹 구현 과정 (1) | 2024.11.06 |
---|---|
SHA-1키 얻는법 (0) | 2024.11.05 |
파이어스토어에 데이터 올리기// 컬렉션 생성하는 과정 (0) | 2024.11.04 |
장바구니 구현 과정 (0) | 2024.11.03 |
개발순서 (1) | 2024.11.02 |