본문 바로가기
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 객체를 사용하여 테스트를 용이하게 할 수 있습니다.
    • 효과적인 유닛 테스트와 통합 테스트를 가능하게 합니다.