[flutter] Injectable을 사용하여 플러터 앱의 의존성 주입 코드 개선하기

의존성 주입(Dependency Injection)은 앱 개발에서 중요한 개념이며, 코드의 유연성과 재사용성을 높이는 데 도움이 됩니다. Flutter에서도 의존성 주입을 적용할 수 있으며, 여러 가지 라이브러리 중에서 Injectable을 사용하면 편리하게 의존성 주입 코드를 개선할 수 있습니다.

Injectable이란?

Injectable은 Flutter에 적용할 수 있는 의존성 주입 라이브러리입니다. 이 라이브러리를 사용하면 의존성을 쉽게 주입하고 관리할 수 있습니다. Injectable은 코드를 재구성하여 종속성 요구사항을 만족시키는 인스턴스를 자동으로 생성하고 주입할 수 있도록 합니다.

설치하기

먼저, 프로젝트에 Injectable을 설치해야 합니다. pubspec.yaml 파일에서 다음과 같이 dependency에 추가합니다.

dependencies:
  injectable: ^1.0.0
  ...

그리고 pubspec.yaml 파일이 있는 위치에서 터미널을 열고 다음 명령어를 실행합니다.

flutter pub get

이제 Injectable을 사용할 준비가 되었습니다.

사용하기

@injectable 어노테이션

의존성 주입을 사용하려는 클래스에 @injectable 어노테이션을 추가합니다. 이 어노테이션은 해당 클래스가 Injectable에서 관리하는 클래스임을 나타내는 역할을 합니다.

import 'package:injectable/injectable.dart';

@injectable
class ApiService {
  // ...
}

@module 어노테이션

의존성 주입으로 사용할 클래스들을 모아놓은 모듈 클래스에 @module 어노테이션을 추가합니다. 모듈은 Injectable이 의존성 주입을 하기 위해 참조할 클래스들의 관계를 정의하는 역할을 합니다.

import 'package:injectable/injectable.dart';

@module
abstract class AppModule {
  @lazySingleton
  ApiService get apiService => ApiService();
  
  @factoryMethod
  UserRepository getUserRepository(ApiService apiService) => UserRepository(apiService);
  
  // ...
}

주입하기

Injectable을 사용하여 의존성을 주입할 때는 getIt global 변수를 사용합니다. getIt은 Injectable이 의존성 객체를 관리하는 컨테이너입니다.

import 'package:injectable/injectable.dart';

void main() {
  configureInjection(Environment.prod);
  
  ApiService apiService = getIt<ApiService>();
  
  // ...
}

이제 의존성이 필요한 곳에서 getIt을 통해 해당 인스턴스를 가져와 사용할 수 있습니다. Injectable은 의존성의 생명주기(Lifecycle)에 따라 인스턴스를 생성하고 관리하기 때문에 코드의 유연성과 재사용성이 높아집니다.

결론

Injectable을 사용하여 플러터 앱의 의존성 주입 코드를 개선할 수 있습니다. 의존성 주입을 활용하면 코드의 가독성과 유지보수성이 향상되며, 테스트하기도 쉬워집니다. Injectable은 Flutter에서 의존성 주입을 구현하기 위한 강력한 도구이므로, 프로젝트에 적용해 보는 것을 추천합니다.

참고 자료