이번 글에서는 플러터(Flutter)에서 의존성 주입(Dependency Injection)을 쉽게 구현할 수 있는 라이브러리인 Inject와 Injectable의 사용 예시에 대해 알아보겠습니다.
1. 의존성 주입이란?
의존성 주입은 애플리케이션에서 각 모듈이나 컴포넌트 간의 의존 관계를 분리하여 유연성과 테스트 용이성을 높이는 방법입니다. 의존성 주입을 사용하면 코드의 가독성과 재사용성을 향상시킬 수 있으며, 특히 프로젝트의 규모가 커질수록 유지보수가 용이해집니다.
2. Inject와 Injectable 소개
Inject는 플러터에서 의존성 주입을 구현하기 위한 라이브러리로, 코드의 복잡함을 낮추고 의존성 주입을 간단하게 정의할 수 있게 도와줍니다. Injectable은 Inject과 함께 사용되어 의존성 주입할 클래스를 정의하는 어노테이션입니다.
3. 사용 예시
3.1. 의존성 주입 설정하기
먼저, get_it
라이브러리를 통해 의존성 주입을 관리할 수 있는 컨테이너를 설정해야 합니다. 다음 코드와 같이 di.dart
파일을 생성하고 필요한 패키지를 import 합니다.
import 'package:get_it/get_it.dart';
import 'package:injectable/injectable.dart';
final getIt = GetIt.instance;
@injectableInit
void configureDependencies() => $initGetIt(getIt);
injectableInit
어노테이션은 의존성 주입 설정 함수를 호출하기 위한 어노테이션입니다. 이제 main.dart
에서 configureDependencies()
함수를 호출하여 의존성 주입을 설정할 수 있습니다.
3.2. 클래스 의존성 주입 설정하기
다음으로, 의존성 주입을 설정할 클래스에 @injectable
어노테이션을 사용합니다. 이 어노테이션은 해당 클래스를 의존성 주입할 수 있는 클래스로 지정합니다. 이후 해당 클래스의 생성자에 @inject
어노테이션을 사용하여 의존성 주입할 필요한 객체를 정의합니다.
import 'package:injectable/injectable.dart';
@injectable
class UserRepository {
UserRepository();
// 의존성 주입할 필요한 객체들
}
@injectable
class UserService {
UserService(UserRepository userRepository);
// 의존성 주입할 필요한 객체들
}
3.3. 의존성 주입 사용하기
이제 의존성 주입이 설정된 클래스를 사용할 수 있습니다. 다음과 같이 main.dart
에서 필요한 의존성들을 주입받을 수 있습니다.
import 'package:flutter/material.dart';
import 'package:injectable_example/di.dart';
import 'package:injectable_example/user_service.dart';
void main() {
configureDependencies();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final UserService userService = getIt<UserService>();
@override
Widget build(BuildContext context) {
// userService를 사용한 코드 작성
}
}
위 예제에서는 UserService
클래스를 사용하기 위해 getIt<UserService>()
로 해당 클래스의 인스턴스를 생성하여 사용하고 있습니다.
4. 결론
이제 Inject와 Injectable을 사용하여 플러터에서 의존성 주입을 간단하게 구현하는 방법에 대해 알아보았습니다. 이를 사용하면 코드의 유연성과 테스트 용이성을 향상시킬 수 있으며, 프로젝트의 규모가 커질수록 유지보수가 용이해집니다. 의존성 주입을 적절하게 사용하여 더 나은 애플리케이션을 개발할 수 있도록 노력해보세요.