[flutter] 플러터에서 Injectable을 활용하여 앱의 테스트 코드 작성 편의성 증가

앱 개발 과정에서 테스트는 매우 중요한 요소입니다. 테스트를 효율적으로 작성하고 관리하기 위해서는 코드를 모듈화하고 의존성을 주입하는 것이 필수적입니다. 이러한 작업을 편리하게 해주는 도구 중 하나가 Injectable입니다.

InjectableDart 기반의 앱 개발 프레임워크인 Flutter에서 사용할 수 있는 의존성 주입(DI) 라이브러리입니다. 이를 활용하면 앱의 테스트 코드 작성 편의성을 크게 높일 수 있습니다.

1. Injectable 설치 및 설정

먼저, pubspec.yaml 파일에 injectable 패키지를 추가합니다. 이후, 패키지를 다운로드하여 설치해야 합니다. 아래는 pubspec.yaml 파일에 injectable 패키지를 추가하는 예시입니다.

dependencies:
  flutter:
    sdk: flutter

  injectable: ^1.4.1

dev_dependencies:
  flutter_test:
    sdk: flutter

설치가 완료되면 프로젝트의 루트 폴더에 injectable.config.yaml 파일을 생성합니다. 이 파일을 통해 Injectable 설정을 관리할 수 있습니다.

2. Injectable 사용하기

2-1. @injectable 어노테이션 사용하기

Injectable을 사용하려면 의존성을 주입하고자 하는 클래스에 @injectable 어노테이션을 추가해야 합니다. 아래는 UserService 클래스를 예시로 @injectable 어노테이션을 사용하는 방법입니다.

@injectable
class UserService {
  // ...
}

2-2. 의존성 주입하기

의존성을 주입하려면 @singleton 혹은 @lazySingleton 어노테이션을 사용해야 합니다. 일반적으로 @singleton 어노테이션은 앱 전체에서 공유되는 의존성에 사용되고, @lazySingleton 어노테이션은 필요 시에만 인스턴스를 생성하는 의존성에 사용됩니다.

@injectable
@singleton
class UserService {
  // ...
}

@injectable
@lazySingleton
class UserRepository {
  // ...
}

위와 같이 설정하면 해당 클래스의 인스턴스가 필요한 곳에서 Injector를 사용하여 주입할 수 있습니다.

3. 테스트 코드 작성하기

Injectable을 사용하면 앱의 테스트 코드 작성이 훨씬 편리해집니다. 테스트 시에는 Mock 객체를 만들어 의존성을 대체하거나 @remove 어노테이션을 사용하여 의존성을 주입하지 않을 수 있습니다.

@injectable
class UserService {
  final UserRepository userRepository;

  UserService(this.userRepository);

  Future<User> getUser(int id) {
    return userRepository.getUser(id);
  }
}

@injectable
@remove
class MockUserRepository implements UserRepository {
  // ...
}

void main() {
  final injector = getTestInjector();

  injector.registerDependency<UserRepository>((_) => MockUserRepository());

  test('getUser test', () async {
    final userService = injector.get<UserService>();
    final user = await userService.getUser(1);

    expect(user.id, 1);
  });
}

위 코드에서 @remove 어노테이션은 UserService에 필요한 UserRepository의 의존성을 제거합니다. 대신에 MockUserRepository를 주입하여 테스트를 수행할 수 있습니다.

4. 결론

Injectable은 플러터에서 테스트 코드 작성을 효율적으로 할 수 있도록 도와주는 유용한 도구입니다. Injectable을 사용하여 의존성 주입을 관리하면 앱의 품질 및 유지 보수성을 향상시킬 수 있습니다. 앱 개발 과정에서 테스트 코드 작성의 편의성을 증가시키고자 한다면 Injectable을 사용해보세요.

References