상태관리 라이브러리가 내장된 시점에서 get_it 사용

이재영·2025년 1월 22일
0

상태 관리 라이브러리와 get_it과 같은 서비스 로케이터는 각각 UI의 상태 관리와 객체 간의 의존성 관리에 널리 사용된다. 하지만 상태관리 라이브러리가 객체 접근을 이미 제공하는 경우, get_it을 사용하는 것이 항상 적절하지 않을 수 있다. 본 글에서는 이러한 상황에서 get_it의 사용 여부를 판단하는 기준을 다시 되새기고자 한다.

상태관리 라이브러리는 요즘 핫하고 현재 배우고 있는 Riverpod를 예시로 사용할려고 한다.


get_it 의존성 주입이 필요한 경우

  • 전역 객체 관리: 앱 전체에서 공유되는 객체(예: API 클라이언트, 데이터베이스 인스턴스)를 get_it에 등록하여, 어디서든 쉽게 접근할 수 있도록 한다.

  • ViewModel 외부에서 Repository / DataSource 사용: ViewModel이 아닌 다른 외부 클래스(예: UseCase, Service)에서 Repository나 DataSource에 접근해야 하는 경우, get_it을 사용하여 의존성을 주입한다.

  • 테스트 용이성: 테스트 시, 실제 객체 대신 가짜(Mock) 객체를 주입하여, 단위 테스트를 쉽게 작성할 수 있다.

예시 코드

final getIt = GetIt.instance;

void setupDependencies() {
  getIt.registerSingleton<DatabaseService>(DatabaseServiceImpl());
  getIt.registerFactory<ApiClient>(() => ApiClient());
}

class MyService {
  final DatabaseService _db = getIt<DatabaseService>();
  final ApiClient _api = getIt<ApiClient>();
  // ...
}


get_it 의존성 주입이 필요하지 않은 경우

상태관리 라이브러리가 이미 특정 객체를 관리하고 있으며, 이를 통해 필요한 데이터를 접근할 수 있다면 굳이 get_it으로 의존성을 주입할 필요가 없다. 상태관리 라이브러리에서 제공하는 기능만으로 충분히 해결할 수 있다.

주로 View에서 ViewModel에 접근하려할때의 경우가 많음

예시 코드

// counter_view_model.dart
class CounterViewModel extends ChangeNotifier {
  int _count = 0;

  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }
}

// main.dart
void main() {
  runApp(
    ProviderScope(
      child: MyApp(),
    ),
  );
}

// counter_view.dart
class CounterView extends StatelessWidget {
  
  Widget build(BuildContext context) {
    final counterViewModel = Provider.of<CounterViewModel>(context); // Provider로 객체 접근

    // ...
            ElevatedButton(
              onPressed: counterViewModel.increment,
              child: Text("Increment"),
            ),
          ],
        ),
      ),
    );
  }
}


주의할 점 : 객체 중복 등록

상태관리 라이브러리와 get_it을 함께 사용할 때는, 객체의 중복 등록을 피하고, 객체의 생명 주기를 신중하게 관리해야 한다. Riverpod를 통해 제공되는 ViewModelget_it에 중복 등록하지 않도록 주의해야한다! (의도하지 않은 동작 발생 가능성 우려)



https://www.reddit.com/r/FlutterDev/comments/rhkawr/provider_riverpod_and_getit_are_not_state/

profile
chmod 000

0개의 댓글