앱 개발 과정에서 테스트는 매우 중요한 요소입니다. 테스트를 효율적으로 작성하고 관리하기 위해서는 코드를 모듈화하고 의존성을 주입하는 것이 필수적입니다. 이러한 작업을 편리하게 해주는 도구 중 하나가 Injectable
입니다.
Injectable
은 Dart
기반의 앱 개발 프레임워크인 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
을 사용해보세요.