새 Flutter 프로젝트를 시작했다.
언제나 그렇듯 Clean Architecture로 설계했고
repository와 usecase를 singleton으로 운영하기위해
DI(Dependency Injection)가 필요하다.
이때, 상태관리 툴로 riverpod를 선택했다면
GetIt과 같은 별도의 DI 솔루션을 도입할 필요가 없다.
왜 그런지 바로 알아보자.
riverpod의 장점중 하나는 doc이 너무도 훌륭하다는 것이다.
여기에서 시키는대로만 하면 패키지 설치와
유용한 lint, plugin까지 활용 가능하다.
void main() {
runApp(const ProviderScope(child: SnowMatchApp()));
}
실행할 앱을 따로 만들어주고,
최상단에서 Provider Scope으로 감싸준다.
이 scope안에서라면 riverpod를 활용한
어떤 데이터도 전역변수처럼 활용할 수 있다.
동시에, 개발자는 초기 선언만 잘 해놓는다면
이 side effect에 대해 크게 신경쓰지 않아도 된다.
이는 riverpod가 아래의 특징을 가지기 때문이다.
final repositoryProvider = Provider<Repository>((ref) => RepositoryImpl());
final useCaseProvider = Provider<UseCase>((ref) => UseCase(repository: ref.watch(repositoryProvider)));
위와 같이 Provider 객체를 만들어주고,
di를 원하는 객체를 만들어주면 된다.
위의 예에서는 repository를 먼저 만들었고,
usecase provider 선언부에서
ref로부터 이 repository 객체를 가져와
파라미터로 전달해준다.
이제 Provider Scope 안에서 언제든지
ref를 통해 usecase를 사용할 수 있다.
아래는 이전 프로젝트에서 Provider와 StateNotifierProvider를 활용해
service > repository > usecase > viewmodel 까지 주입하는 모습이다.
끝!!