코딩/★★★트러블 슈팅

파베 블록만 써서가져오지말고, 레퍼지토리 거쳐야하는 이유: 수정

흑백 개발자 2024. 11. 6. 15:40
728x90

근데 생각해보니

UI (이벤트 발생) -> Bloc (직접 Firestore 쿼리) -> Firestore -> Bloc (데이터 변환) -> UI (상태 업데이트)

이런 구조나

UI -> Bloc -> Repository -> Firestore -> Repository -> Bloc -> UI

이 구조나 코드 생긴게 안이뻐서 그렇지, 어차피 기능상 문제 없는거 아냐? 블럭만 쓰면 기능상 심각한 차이가 있어?

 

A  읽어보니 가장 큰 문제는 블록 사용하면 수정시 관련된 블럭마다 수정해 줘야함

 

 

기능상으로는 심각한 차이가 없습니다. 둘 다 데이터를 정상적으로 가져올 수 있죠. 하지만 실제 프로젝트에서 중요한 차이점들이 있습니다:

  1. 실제 프로젝트 상황
  2.  
// 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