[Flutter] DI / get_it 정리하기

도톨이·2024년 7월 28일
0

앱 개발-flutter

목록 보기
28/29

DI

안드로이드에서는 보통 Dagger를 통해 의존성을 주입한다. Flutter 에서는 어떤 방식을 사용할까?
물론 외부라이브러리를 쓰지 않고, 직접 ViewModel 클래스안에서 fianl 로 Repository 를 선언하고 생성자에서 이를 받는 방식으로 Repository 를 주입받을 수 있다.

외부 라이브러리를 쓰지 않고 DI 를 진행하는 예시 코드를 보자.
리포지토리에는 데이터소스로부터 사용자의 데이터를 가져오는 로직이 있다고 하자.

// UserRepository.dart
class UserRepository {
  void fetchUserData() {
    // 사용자 데이터 가져오기 로직
  }
}

뷰모델에서는 다음처럼 : 뒤에 이어진 생성자 초기화 리스트를 통해 리포지토리의 인스턴스로 초기화된다.


// UserViewModel.dart
class UserViewModel {
  final UserRepository _userRepository;

  UserViewModel() : _userRepository = UserRepository();

  void getUserData() {
    _userRepository.fetchUserData();
  }
}

사용할 때는 다음처럼 뷰모델을 거쳐서 사용할 수 있을 것이다.

// main.dart
void main() {
  UserViewModel userViewModel = UserViewModel();
  userViewModel.getUserData();
}

그러나 보통은 DI 라이브러리를 사용한다. 많이 사용되는게 바로 GetIt 라이브러리이다.

위의 예시를 GetIt 라이브러리를 사용하여 이해해보자.

레포지토리는 동일하고
뷰모델 부분에서 다음처럼 getIt 을 쓸 수 있다.

// UserViewModel.dart
class UserViewModel {
  final UserRepository _userRepository = getIt<UserRepository>();

  void getUserData() {
    _userRepository.fetchUserData();
  }
}

이때 의존성들을 중앙 집중식으로 관리하기 위한 locator 파일을 만들 수 있다. 의존성을 한 곳에서 관리함으로써 코드의 일관성을 유지하고, 변경 사항이 발생할 때 쉽게 수정할 수 있다

아래의 코드를 보면, 유저 리포지토리를 싱글톤으로 등록하는 것을 알 수 있다. registerLazySingleton은 get_it 패키지에서 제공하는 메서드로, 애플리케이션이 실행되는 동안 단 하나의 인스턴스만 생성되도록 보장하는 방식으로 의존성을 등록하는 방법이다. 이 방법으로 특정 클래스의 인스턴스가 하나만 생성되도록 보장할 수 있다.

// locator.dart (GetIt 설정 파일)
import 'package:get_it/get_it.dart';

final GetIt getIt = GetIt.instance;

void setupLocator() {
  getIt.registerLazySingleton<UserRepository>(() => UserRepository());
}

main에서 Locator 을 설정해주면 된다.

// main.dart
import 'locator.dart';

void main() {
  setupLocator();
  UserViewModel userViewModel = UserViewModel();
  userViewModel.getUserData();
}

Get It 사용하기

  1. get_it 을 사용하려면 pubspec.yaml 파일에 get_it 패키지를 추가해야한다.
dependencies:
  get_it: ^7.2.0
  1. 그리고,GetIt 인스턴스를 생성하고 의존성을 한 곳(locator.dart)에서 등록한다.
import 'package:get_it/get_it.dart';

final GetIt getIt = GetIt.instance;

void setupLocator() {
  getIt.registerLazySingleton<UserRepository>(() => UserRepositoryImpl());
  getIt.registerLazySingleton<AuthService>(() => AuthService());
}
  1. 앱이 시작되기 전에 의존성을 설정하기 위해 main.dart 에서 Locator을 설정한다.
import 'locator.dart';

void main() {
  setupLocator();
  runApp(MyApp());
}
  1. 의존성을 사용할 때는 필요한 곳에서 GetIt 을 통해 가져와서 사용할 수 있다.
import 'locator.dart';

class UserViewModel {
  final UserRepository _userRepository = getIt<UserRepository>();

  void fetchUserData() {
    _userRepository.getData();
  }
}
profile
Computer Engineering

0개의 댓글

관련 채용 정보