Flutter 애플리케이션 개발에서 Repository와 Controller 패턴은 핵심적인 역할을 한다. 이 두 패턴을 마스터하면, 애플리케이션의 가독성, 유지보수성, 재사용성, 테스트 용이성을 크게 향상시킬 수 있다.
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;
}
}
장점
- 비동기 작업 처리:
AsyncNotifier
를 통해 비동기 작업을 쉽게 처리할 수 있다.FutureProvider
를 사용하여 UI에서 비동기 작업의 상태를 관리할 수 있다.
- 의존성 주입:
build
메서드를 통해 의존성을 주입하여 필요한 리소스를 가져오고.- 의존성 역전 원칙에 부합.
- 비즈니스 로직 분리:
MatchTabController
는 비즈니스 로직을 관리하며, UI와 데이터 계층 간의 상호 작용을 처리.- 단일 책임 원칙에 적합.
단점
- 복잡성 증가:
- 비동기 작업이 많아질수록 코드의 복잡성이 증가할 수 있다.
- 상태 관리와 비동기 작업이 결합되면 가독성이 떨어질 수 있다.
- 테스트 복잡성:
- 비동기 작업을 테스트하기 위해 추가적인 설정이 필요할 수 있다.
build 메서드: 의존성 주입과 초기 상태 설정의 비밀
build 메서드는 컨트롤러가 초기화될 때 호출되며, 의존성을 주입하고 초기 상태를 설정하는 데 사용.
이점:
- 의존성 주입:
build
메서드를 통해 필요한 의존성을 주입받을 수 있다.- 예를 들어,
MatchTabRepository
를 주입받아 컨트롤러에서 사용할 수 있다.
- 초기 상태 설정:
- 컨트롤러의 초기 상태를 설정할 수 있다.
- 초기화 시 필요한 데이터를 로드하거나 상태를 설정할 수 있다.
- 유연성:
build
메서드를 통해 동적으로 의존성을 주입할 수 있어 다양한 상황에 대처할 수 있다.- 예를 들어, 유저의 UID와 같은 동적인 값을 주입받을 수 있다.
개발 원칙에의 적합성
- 의존성 역전 원칙:
build
메서드를 통해 의존성을 주입받아 컨트롤러가 필요한 리소스를 얻을 수 있다.- 이는 높은 응집도와 낮은 결합도를 유지할 수 있게 해준다.
- 단일 책임 원칙:
MatchTabController
는 비즈니스 로직을 관리하고, 데이터 계층과 UI 간의 상호 작용을 처리한다.- 단일 책임 원칙에 적합하여 유지보수성을 높입니다.
- 테스트 용이성:
- 의존성 주입을 통해 Mock 객체를 사용하여 테스트를 용이하게 할 수 있습니다.
- 효과적인 유닛 테스트와 통합 테스트를 가능하게 합니다.