[flutter] 플러터에서 Inject와 Injectable의 동작 방식 이해하기

플러터는 인기 있는 모바일 앱 개발 프레임워크 중 하나로, 개발자들에게 신속하고 효율적인 개발을 가능하게 해줍니다. 하지만 규모가 큰 앱을 개발할 때 의존성 관리는 어려울 수 있습니다. 이러한 문제를 해결하기 위해 Inject 및 Injectable 라이브러리를 사용할 수 있습니다.

Inject와 Injectable이란?

Inject와 Injectable은 플러터에서 의존성 주입을 위한 라이브러리입니다. 의존성 주입은 객체 간의 의존 관계를 정의하고, 해당 객체를 인스턴스화하고 제공함으로써 코드의 유연성을 향상시키는 디자인 패턴입니다.

Inject 사용하기

Inject를 사용하기 위해서는 다음 단계를 따릅니다.

  1. injectable 어노테이션을 사용하여 클래스를 주석 처리합니다.
    @injectable
    class MyService {
      //...
    }
    
  2. @module 어노테이션으로 의존성 주입 모듈을 생성합니다. ```dart @Module() abstract class AppModule {

@singleton MyService get myService;

@lazySingleton AnotherService get anotherService;

//… }


3. `@GetIt` 라이브러리의 `GetIt` 인스턴스를 생성하고, 모듈을 등록합니다.
```dart
final getIt = GetIt.instance;

void setupDependencies() {
  getIt
    ..registerSingleton<MyService>(MyService())
    ..registerLazySingleton<AnotherService>(() => AnotherService());
  
  //...
}
  1. 앱 시작 시 setupDependencies() 함수를 호출하여 의존성을 설정합니다.
    void main() {
      setupDependencies();
      runApp(MyApp());
    }
    

Inject를 사용하면 다른 클래스에서 해당 의존성을 사용할 수 있습니다.

class SomeOtherClass {
  final MyService _myService = GetIt.instance<MyService>();
  //...
}

Injectable 사용하기

Injectable은 Inject보다 강력한 기능을 제공하는 라이브러리입니다. Injectable은 코드 생성을 이용하여 의존성 주입을 단순화하고, 플러터의 개발 속도를 향상시킵니다.

Injectable을 사용하기 위해서는 다음 단계를 따릅니다.

  1. @Injectable 어노테이션을 사용하여 클래스를 주석 처리합니다.
    @Injectable()
    class MyService {
      //...
    }
    
  2. @module 어노테이션으로 의존성 주입 모듈을 생성합니다. Inject와는 달리 클래스별로 의존성을 설정할 수 있습니다. ```dart @module abstract class AppModule {

@lazySingleton MyService get myService;

@singleton AnotherService get anotherService;

//… }


3. `build_runner` 패키지를 사용하여 코드를 생성합니다.
```bash
flutter packages pub run build_runner build
  1. 생성된 코드를 앱에 적용합니다.
    void main() {
      $initGetIt(getIt);
      runApp(MyApp());
    }
    

Injectable을 사용하면 @inject 어노테이션을 통해 클래스 내에서 의존성을 주입할 수 있습니다.

class SomeOtherClass {
  @inject
  MyService myService;
  //...
}

이러한 방식으로 Inject와 Injectable을 사용하여 플러터 앱의 의존성 관리를 효율적으로 수행할 수 있습니다.

참고 자료