[flutter] 플러터에서 Inject와 Injectable을 사용하여 코드 분리하기

코드 분리는 소프트웨어 개발에서 중요한 원칙 중 하나입니다. 코드를 적절하게 분리하면 유지보수가 쉬워지고 확장성이 향상됩니다. 플러터(Flutter) 앱에서도 코드를 적절하게 분리할 수 있는 다양한 방법이 있습니다. 이 중에서 InjectInjectable 라이브러리를 사용하는 방법을 살펴보겠습니다.

Inject와 Injectable 소개

InjectInjectable은 플러터 앱에서 의존성 주입(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은 의존성을 관리하는 객체입니다.
}

이제 코드를 분리하기 위한 준비가 완료되었습니다. 이제부터는 InjectInjectable을 사용하여 의존성을 주입할 수 있습니다.

의존성 주입 예제

예를 들어, UserServiceUserRepository라는 두 가지 클래스가 있다고 가정해봅시다. UserServiceUserRepository를 사용하여 사용자 정보를 가져오는 역할을 합니다.

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");

정리

InjectInjectable을 사용하면 플러터 앱에서 손쉽게 의존성 주입을 구현할 수 있습니다. 이를 통해 코드를 더욱 깔끔하고 유연하게 구성할 수 있으며, 유지보수와 테스트가 쉬워집니다. 실제 앱에서 이러한 패턴을 사용하면 개발자의 생산성을 향상시킬 수 있습니다.

더 자세한 내용은 Injectable 패키지의 문서를 참고하시기 바랍니다.