[flutter] get_it를 사용하여 테스트와 프로덕션 코드 간의 분리를 어떻게 할 수 있는가?

애플리케이션 개발 시 종종 테스트와 프로덕션 코드를 분리해야 할 때가 있습니다. 이를 위해 의존성 주입(Dependency Injection) 프레임워크를 사용할 수 있는데, Flutter에서는 get_it라는 패키지를 사용하여 이를 구현할 수 있습니다.

get_it 패키지란

get_it는 Flutter 앱에서 의존성 주입을 쉽게 구현할 수 있게 도와주는 패키지입니다. 이 패키지를 사용하면 애플리케이션 전체에서 사용하는 싱글톤 객체를 등록하고 가져올 수 있습니다.

테스트와 프로덕션 코드를 분리하는 방법

get_it 패키지를 사용하여 테스트와 프로덕션 코드를 분리하는 방법은 다음과 같습니다.

1. 의존성 주입을 위한 클래스 작성

테스트와 프로덕션 코드 모두에서 사용할 의존성 주입 클래스를 작성합니다. 이 클래스에는 싱글톤으로 사용할 객체들을 등록하고 가져올 수 있는 코드를 작성합니다.

class DIContainer {
  static final DIContainer instance = DIContainer._init();

  DIContainer._init() {
    // 의존성 주입을 위한 객체들을 등록합니다.
    GetIt.I.registerSingleton<MyService>(MyServiceImpl());
    // ...
  }

  MyService get myService => GetIt.I<MyService>();
  // ...
}

2. 테스트 코드 작성

테스트 코드에서는 싱글톤 객체들을 목(mock)객체로 대체하여 테스트할 수 있도록 해야 합니다. 이를 위해 get_it 패키지의 get_it.unregister<T>() 메서드를 사용하여 등록된 객체를 해제하고, 대신 테스트에 필요한 목객체를 등록합니다.

void main() {
  // 테스트용 MyService 목객체
  class MyServiceMock extends Mock implements MyService {}
  
  setUp(() {
    // 프로덕션 코드에서 등록된 객체를 해제하고, 목객체를 등록합니다.
    GetIt.I.unregister<MyService>();
    GetIt.I.registerSingleton<MyService>(MyServiceMock());
  });
  
  // ...
}

3. 프로덕션 코드 작성

프로덕션 코드에서는 테스트에 사용할 목객체를 등록하지 않고, 실제로 사용할 싱글톤 객체를 등록합니다.

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 의존성 주입 클래스를 사용하여 실제 객체를 가져옵니다.
  final myService = DIContainer.instance.myService;
  
  // ...
}

결론

get_it 패키지를 사용하면 테스트와 프로덕션 코드를 간단하게 분리할 수 있습니다. 의존성 주입을 통해 애플리케이션의 유지보수와 테스트 용이성을 향상시킬 수 있으며, get_it의 다양한 기능을 활용하여 응용 프로그램 개발에 도움을 받을 수 있습니다.


참고: