728x90
근데 생각해보니
UI (이벤트 발생) -> Bloc (직접 Firestore 쿼리) -> Firestore -> Bloc (데이터 변환) -> UI (상태 업데이트)
이런 구조나
UI -> Bloc -> Repository -> Firestore -> Repository -> Bloc -> UI
이 구조나 코드 생긴게 안이뻐서 그렇지, 어차피 기능상 문제 없는거 아냐? 블럭만 쓰면 기능상 심각한 차이가 있어?
A 읽어보니 가장 큰 문제는 블록 사용하면 수정시 관련된 블럭마다 수정해 줘야함
기능상으로는 심각한 차이가 없습니다. 둘 다 데이터를 정상적으로 가져올 수 있죠. 하지만 실제 프로젝트에서 중요한 차이점들이 있습니다:
- 실제 프로젝트 상황
// 1. 같은 쿼리가 여러 곳에서 필요한 경우
class TodaySaleBloc {
// 40% 이상 할인 상품 쿼리
final snapshots = await _firestore
.collection('products')
.where('discountPercent', isGreaterThanOrEqualTo: 40)
.orderBy('discountPercent', descending: true)
.get();
}
class SearchBloc {
// 똑같은 쿼리 복사-붙여넣기
final snapshots = await _firestore
.collection('products')
.where('discountPercent', isGreaterThanOrEqualTo: 40)
.orderBy('discountPercent', descending: true)
.get();
}
2.쿼리 조건 변경 시
// 할인율 40%에서 30%로 변경해야 할 때
// Repository 사용: 한 곳만 수정
class TodaySaleRepository {
static const MIN_DISCOUNT = 30; // 여기만 수정
Future<List<ProductModel>> getProducts() {
return _firestore
.collection('products')
.where('discountPercent', isGreaterThanOrEqualTo: MIN_DISCOUNT)
...
}
}
// Bloc만 사용: 여러 곳 수정 필요
class TodaySaleBloc {
// 여기 수정
.where('discountPercent', isGreaterThanOrEqualTo: 30)
}
class SearchBloc {
// 여기도 수정
.where('discountPercent', isGreaterThanOrEqualTo: 30)
}
class FilterBloc {
// 여기도 수정
.where('discountPercent', isGreaterThanOrEqualTo: 30)
}
3.에러 처리 방식 변경 시
// Repository: 한 곳에서 일관된 에러 처리
class TodaySaleRepository {
Future<List<ProductModel>> getProducts() {
try {
// 쿼리 로직
} catch (e) {
await logError(e); // 에러 로깅 추가
await notifyAdmin(e); // 관리자 알림 추가
throw CustomException(e);
}
}
}
// Bloc만 사용: 각 Bloc마다 에러 처리 수정 필요
class TodaySaleBloc {
try {
// 쿼리 로직
} catch (e) {
await logError(e); // 여기 추가
await notifyAdmin(e); // 여기 추가
}
}
class SearchBloc {
try {
// 쿼리 로직
} catch (e) {
await logError(e); // 여기도 추가
await notifyAdmin(e); // 여기도 추가
}
}
결론적으로:
- 작은 프로젝트나 쿼리가 한 곳에서만 쓰이는 경우: Bloc에서 직접 처리해도 큰 문제 없음
- 실무나 큰 프로젝트의 경우:
- 코드 중복 발생
- 변경사항 적용이 어려움
- 일관된 에러 처리가 어려움
- 테스트 작성이 복잡해짐
따라서 현재는 문제없더라도, 프로젝트가 커질 것을 대비해 Repository 패턴을 사용하는 것이 좋습니다.
728x90
'코딩 > ★★★트러블 슈팅' 카테고리의 다른 글
BlocListener는 Bloc 상태 관리에서 매우 유용한 위젯 (1) | 2024.11.13 |
---|---|
닉네임, 비밀번호 등등 오류해결 (1) | 2024.11.13 |
파베에서 데이터 끌어올때 블록만?VS 레퍼지토리 같이? (0) | 2024.11.06 |
Map<String, dynamic> 방식 (0) | 2024.11.04 |
date time 타입변화 에러 (0) | 2024.11.04 |