본문 바로가기
Flutter

controller 구조를 생각해보자 [flutter] [firebase]

by 난타코다옹 2024. 7. 8.

목차

    Flutter 애플리케이션 개발에서 RepositoryController 패턴은 핵심적인 역할을 한다. 이 두 패턴을 마스터하면, 애플리케이션의 가독성, 유지보수성, 재사용성, 테스트 용이성을 크게 향상시킬 수 있다.

    Repository 패턴: 데이터 관리의 중심

    Repository는 다양한 데이터 소스와 애플리케이션 간의 추상화 계층을 제공한다. 데이터베이스, 네트워크, 캐시 등 다양한 데이터 소스로부터 데이터를 관리한다.

    장점:

    • 데이터 소스 변경 시 애플리케이션 로직에 영향 X.
    • 데이터 접근 로직을 한 곳에 집중하여 관리.
    • 테스트가 용이해진다.

    Controller 패턴: 비즈니스 로직의 수호자

    Controller는 비즈니스 로직을 관리, UI와 데이터 계층 간의 상호 작용을 처리. 주로 상태 관리와 이벤트 처리를 담당한다.

    장점:

    • UI와 비즈니스 로직을 분리하여 코드의 가독성과 유지보수성 good.
    • 상태 관리와 이벤트 처리를 중앙 집중화하여 관리할 수 있다.
    • 테스트가 용이해진다.

    MatchTabController: 실전 예시

    final futureMatchNumberProvider = FutureProvider<MatchModel>((ref) {
      return ref.watch(matchTabControllerProvider.notifier).getFutureMatchNumber();
    });
    
    final matchTabControllerProvider 
      = AsyncNotifierProvider<MatchTabController, void>(() 
      => MatchTabController());
    
    class MatchTabController extends AsyncNotifier<void> {
      late final MatchTabRepository _repository;
    
      String get uid => ref.read(uidProvider);
    
      @override
      FutureOr<void> build() {
        _repository = ref.read(matchTabRepositoryProvider);
      }
    
      Future<MatchModel> getFutureMatchNumber() async {
        _repository.deleteMatchAfterAHour();
        final getNumber = await _repository.getFutureMatchNumber(uid);
        return getNumber;
      }
    }

    장점

    1. 비동기 작업 처리:

      • AsyncNotifier를 통해 비동기 작업을 쉽게 처리할 수 있다.
      • FutureProvider를 사용하여 UI에서 비동기 작업의 상태를 관리할 수 있다.
    2. 의존성 주입:

      • build 메서드를 통해 의존성을 주입하여 필요한 리소스를 가져오고.
      • 의존성 역전 원칙에 부합.
    3. 비즈니스 로직 분리:

      • MatchTabController는 비즈니스 로직을 관리하며, UI와 데이터 계층 간의 상호 작용을 처리.
      • 단일 책임 원칙에 적합.

    단점

    1. 복잡성 증가:

      • 비동기 작업이 많아질수록 코드의 복잡성이 증가할 수 있다.
      • 상태 관리와 비동기 작업이 결합되면 가독성이 떨어질 수 있다.
    2. 테스트 복잡성:

      • 비동기 작업을 테스트하기 위해 추가적인 설정이 필요할 수 있다.

    build 메서드: 의존성 주입과 초기 상태 설정의 비밀

    build 메서드는 컨트롤러가 초기화될 때 호출되며, 의존성을 주입하고 초기 상태를 설정하는 데 사용.

    이점:

    1. 의존성 주입:

      • build 메서드를 통해 필요한 의존성을 주입받을 수 있다.
      • 예를 들어, MatchTabRepository를 주입받아 컨트롤러에서 사용할 수 있다.
    2. 초기 상태 설정:

      • 컨트롤러의 초기 상태를 설정할 수 있다.
      • 초기화 시 필요한 데이터를 로드하거나 상태를 설정할 수 있다.
    3. 유연성:

      • build 메서드를 통해 동적으로 의존성을 주입할 수 있어 다양한 상황에 대처할 수 있다.
      • 예를 들어, 유저의 UID와 같은 동적인 값을 주입받을 수 있다.

    개발 원칙에의 적합성

    1. 의존성 역전 원칙:

      • build 메서드를 통해 의존성을 주입받아 컨트롤러가 필요한 리소스를 얻을 수 있다.
      • 이는 높은 응집도와 낮은 결합도를 유지할 수 있게 해준다.
    2. 단일 책임 원칙:

      • MatchTabController는 비즈니스 로직을 관리하고, 데이터 계층과 UI 간의 상호 작용을 처리한다.
      • 단일 책임 원칙에 적합하여 유지보수성을 높입니다.
    3. 테스트 용이성:

      • 의존성 주입을 통해 Mock 객체를 사용하여 테스트를 용이하게 할 수 있습니다.
      • 효과적인 유닛 테스트와 통합 테스트를 가능하게 합니다.