[flutter] 플러터에서 Injectable을 사용한 코드 재사용성 증가 방법

앱 개발에서 코드 재사용성은 매우 중요합니다. 코드를 재사용하면 개발 시간을 단축하고 유지 보수를 간편하게 할 수 있습니다. 플러터(Flutter)에서는 Injectable 라이브러리를 사용하여 코드의 재사용성을 높일 수 있습니다.

Injectable은 의존성 주입(Dependency Injection) 패턴을 플러터 앱에서 사용하기 쉽게 만들어주는 라이브러리입니다. 의존성 주입은 앱의 다른 부분에서 사용되는 객체 또는 서비스를 중앙 집중화하여 관리하는 기술입니다.

1. Injectable 라이브러리 설치

프로젝트의 pubspec.yaml 파일에 아래와 같이 Injectable 라이브러리를 추가해줍니다.

dependencies:
  injectable: ^1.5.0
  injectable_generator: ^1.5.0

설치가 완료되면 pubspec.yaml 파일을 저장하고, 터미널에서 flutter pub get 명령어를 실행하여 종속성을 다운로드 받습니다.

2. Injectable 사용 예제

2.1. 의존성 주입 가능한 클래스 생성

먼저 의존성 주입 가능한 클래스를 생성합니다. 예를 들어, ApiService 클래스를 생성해보겠습니다.

import 'package:injectable/injectable.dart';

@lazySingleton
class ApiService {
  void fetchData() {
    // 데이터를 가져오는 로직
  }
}

@lazySingleton 어노테이션은 클래스가 싱글톤으로 생성되어, 여러 곳에서 동일한 인스턴스를 사용할 수 있게 합니다.

2.2. 의존성 주입 가능한 클래스 등록

클래스를 등록하여 의존성 주입이 가능하도록 만들어줍니다. injectable 어노테이션을 사용하여 클래스를 등록하면 됩니다.

import 'package:injectable/injectable.dart';

@injectable
class MyHomePage extends StatefulWidget {
  final ApiService apiService;

  MyHomePage(this.apiService);

  // Widget 생략

  void fetchData() {
    apiService.fetchData();
  }
}

MyHomePage 클래스에서 ApiService를 사용할 수 있도록 생성자 매개변수로 주입받습니다.

2.3. 의존성 주입 모듈 생성

마지막으로, 의존성 주입 모듈을 생성하여 클래스를 바인딩해줍니다.

import 'package:injectable/injectable.dart';
import 'package:example_project/main.dart';
import 'package:example_project/services/api_service.dart';

@module
abstract class InjectableModule {
  @singleton
  ApiService get apiService => ApiService();

  @lazySingleton
  MyHomePage get myHomePage => MyHomePage(get<ApiService>());
}

@registerModule
abstract class AppModule {
  // MyApp 클래스 추가
}

@module 어노테이션은 모듈을 정의하는 클래스를 지정하고, @singleton, @lazySingleton 어노테이션을 사용하여 인스턴스를 바인딩합니다. @registerModule 어노테이션은 앱의 모듈을 등록하는 역할을 합니다.

3. 코드에서 의존성 주입 사용하기

이제 등록한 클래스를 코드에서 사용할 수 있습니다. 예를 들어, MyHomePage 클래스의 인스턴스를 생성하고 메소드를 호출해보겠습니다.

import 'package:example_project/services/api_service.dart';
import 'package:example_project/main.dart';
import 'package:injectable/injectable.dart';

void main() {
  configureInjection(InjectableModule());
  
  // ApiService 인스턴스 가져오기
  final apiService = get<ApiService>();

  // MyHomePage 인스턴스 생성
  final myHomePage = get<MyHomePage>();

  // 데이터 가져오기
  myHomePage.fetchData();
  
  // 나머지 코드
}

위의 예제에서 configureInjection 함수를 사용하여 의존성 주입을 구성합니다. get<T>() 함수를 사용하여 등록한 클래스의 인스턴스를 가져올 수 있습니다.

결론

Injectable 라이브러리를 사용하면 플러터 앱에서 코드의 재사용성을 증가시킬 수 있습니다. 의존성 주입을 사용함으로써 객체 간의 결합도를 낮출 수 있고, 코드를 더 유연하고 테스트하기 쉽게 만들 수 있습니다.