[flutter] Injectable을 사용하여 플러터 앱의 테스트 용이성 향상하기

앱 개발 중에 테스트 코드 작성 및 관리는 매우 중요한 과정입니다. 이를 효과적으로 수행하기 위해서는 코드의 의존성을 잘 관리하여 테스트 용이성을 확보해야 합니다. Injectable는 플러터 앱의 의존성 주입을 효과적으로 처리하기 위한 도구입니다. 이를 통해 테스트 용이성을 향상시킬 수 있습니다.

1. Injectable이란?

Injectable은 플러터 앱에서 의존성 주입을 쉽게 구현할 수 있도록 도와주는 라이브러리입니다. 이 라이브러리를 사용하여 앱의 모듈을 정의하고, 이를 사용하는 클래스들에게 의존성 주입을 제공할 수 있습니다.

2. 사용방법

먼저, 프로젝트의 pubspec.yaml 파일에 injectable 패키지를 추가해야 합니다.

dependencies:
  injectable: ^1.0.0

다음으로, main.dart 파일에서 configureInjection 함수를 호출해야 합니다. 이 함수는 앱의 의존성 주입을 설정하는 역할을 합니다. 보통 앱이 실행되는 main 함수에서 호출하면 됩니다.

import 'package:injectable/injectable.dart';

void main() {
  configureInjection(Environment.dev);
  runApp(MyApp());
}

이제, 의존성 주입을 제공할 클래스에 @injectable 어노테이션을 추가해야 합니다. 아래는 의존성 주입을 사용하는 예시입니다.

@injectable
class UserRepository {
  final ApiClient _apiClient;

  UserRepository(this._apiClient);

  //...
}

Injectable은 클래스 생성자를 분석하여 필요한 의존성을 자동으로 주입해줍니다. 위 예시에서는 UserRepository 클래스의 생성자에 ApiClient라는 의존성을 주입해 줍니다.

Injectable은 또한 환경별로 다른 의존성 주입을 할 수 있도록 설정할 수 있습니다. 예를 들어, 개발 환경에서는 가짜 데이터를 사용하고, 실제 환경에서는 실제 데이터를 사용하게 할 수 있습니다. 이를 위해 @Environment 어노테이션을 사용하여 환경을 설정할 수 있습니다.

@Environment(Environment.dev)
abstract class UserRepository {}

위의 예시에서는 UserRepository가 개발 환경에서만 사용되도록 설정되었습니다.

3. 테스트 코드 작성 및 실행

Injectable을 사용하여 의존성 주입이 잘 이루어지면, 테스트 코드 작성 및 실행이 쉬워집니다. 테스트 환경에서는 필요한 Mock 클래스를 주입하여 테스트를 수행할 수 있습니다.

@injectable
class MockApiClient extends Mock implements ApiClient {}

void main() {
  configureInjection(Environment.test);
  
  testWidgets('UserRepository 테스트', (tester) async {
    final mockApiClient = MockApiClient();
    final userRepository = getIt<UserRepository>();

    // ...

    await tester.pumpWidget(MyApp());

    // ...

    verify(mockApiClient.getUserData()).called(1);
  });
}

위의 예시에서는 MockApiClient를 주입하여 UserRepository의 테스트를 수행하고 있습니다. 이렇게 하면 실제 API 호출이 발생하지 않고, 가짜 데이터를 사용하는 테스트를 작성할 수 있습니다.

4. 결론

Injectable을 사용하여 플러터 앱의 의존성 주입을 효과적으로 처리할 수 있습니다. 이를 통해 테스트 용이성을 향상시키고, 신속하고 정확하게 앱을 개발할 수 있습니다. 추가적으로 Injector와 다른 기능에 대해서는 공식 문서를 참고하시기 바랍니다.