코드 분리는 소프트웨어 개발에서 중요한 원칙 중 하나입니다. 코드를 적절하게 분리하면 유지보수가 쉬워지고 확장성이 향상됩니다. 플러터(Flutter) 앱에서도 코드를 적절하게 분리할 수 있는 다양한 방법이 있습니다. 이 중에서 Inject
와 Injectable
라이브러리를 사용하는 방법을 살펴보겠습니다.
Inject와 Injectable 소개
Inject
와 Injectable
은 플러터 앱에서 의존성 주입(Dependency Injection)을 쉽게 구현할 수 있게 도와주는 라이브러리입니다. 의존성 주입은 각 모듈이나 클래스 간의 의존 관계를 명확하게 정의하고 느슨한 결합을 유지하는 것을 의미합니다.
Inject
는 코드 생성 도구이며, Injectable
은 주입 가능한 클래스를 정의하기 위한 어노테이션입니다. 이 두 가지를 사용하면, 앱에 필요한 개체를 쉽게 주입할 수 있고 테스트하기도 편리해집니다.
설치 및 설정
먼저 injectable
패키지를 pubspec.yaml
에 추가해야 합니다. 패키지 추가 후, flutter pub get
명령어를 실행하여 의존성을 설치합니다.
dependencies:
injectable: ^1.6.6
injectable_generator: ^2.0.0
build_runner: ^1.12.2
그리고 main.dart
파일의 상단에 다음 코드를 추가하여 injectable
패키지를 초기화합니다.
import 'package:injectable/injectable.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await configureInjection(Environment.prod);
runApp(MyApp());
}
@injectableInit
void configureInjection(String environment) {
$initGetIt(getIt, environment: environment); // getIt은 의존성을 관리하는 객체입니다.
}
이제 코드를 분리하기 위한 준비가 완료되었습니다. 이제부터는 Inject
와 Injectable
을 사용하여 의존성을 주입할 수 있습니다.
의존성 주입 예제
예를 들어, UserService
와 UserRepository
라는 두 가지 클래스가 있다고 가정해봅시다. UserService
는 UserRepository
를 사용하여 사용자 정보를 가져오는 역할을 합니다.
import 'package:injectable/injectable.dart';
@injectable
class UserRepository {
Future<User> getUser(String userId) async {
// 사용자 정보를 가져오는 로직
}
}
@injectable
class UserService {
final UserRepository _userRepository;
UserService(this._userRepository);
Future<User> getUser(String userId) async {
return await _userRepository.getUser(userId);
}
}
위의 예제에서 @injectable
어노테이션은 해당 클래스가 주입 가능하다는 것을 표시합니다. 이제 UserService
에서 UserRepository
를 주입하고 사용할 수 있습니다.
주입은 생성자를 통해 이루어집니다. UserService
의 생성자에서 UserRepository
를 주입받고, 필요한 곳에서 사용할 수 있습니다.
final userService = User.Fetcher(getIt<UserService>());
final user = await userService.getUser("123");
정리
Inject
와 Injectable
을 사용하면 플러터 앱에서 손쉽게 의존성 주입을 구현할 수 있습니다. 이를 통해 코드를 더욱 깔끔하고 유연하게 구성할 수 있으며, 유지보수와 테스트가 쉬워집니다. 실제 앱에서 이러한 패턴을 사용하면 개발자의 생산성을 향상시킬 수 있습니다.
더 자세한 내용은 Injectable 패키지의 문서를 참고하시기 바랍니다.