[flutter] Inject와 Injectable을 활용한 모듈화 방법

안녕하세요! Flutter 개발을 하시는 분들에게 Dependency Injection(DI)과 모듈화에 대해 소개해드리려고 합니다. DI와 모듈화는 애플리케이션을 개발할 때 유지보수성과 확장성을 향상시키는데 매우 유용합니다. 이를 위해 Flutter에서는 injectinjectable 패키지를 사용할 수 있습니다.

1. DI란 무엇인가요?

DI는 애플리케이션의 구성 요소 간의 의존성을 외부에서 주입하는 디자인 패턴입니다. 일반적으로 애플리케이션이 커지게 되면 다양한 모듈과 클래스가 생기면서 의존성도 복잡해집니다. DI를 사용하면 모듈 간의 결합도를 낮추고 코드의 재사용성과 테스트 용이성을 향상시킬 수 있습니다.

2. Injectable 패키지란 무엇인가요?

injectable 패키지는 Dart와 Flutter에서 DI를 구현하기 위한 툴킷입니다. 이 패키지를 사용하면 inject 어노테이션을 통해 의존성 주입을 보다 쉽게 구현할 수 있습니다. 또한, 코드를 모듈화하고 테스트하기 편리하게 만들 수 있습니다.

3. injectable 패키지 설치하기

먼저 프로젝트의 pubspec.yaml 파일에 다음과 같은 의존성을 추가해주세요:

dependencies:
  injectable: ^1.6.0
  injectable_generator: ^1.6.0

그리고 pub get 명령어를 실행하여 패키지를 설치해주세요.

4. 모듈화된 클래스 생성하기

injectable 패키지를 사용하여 모듈화된 클래스를 생성해보겠습니다. 다음과 같이 클래스를 작성해주세요:

import 'package:injectable/injectable.dart';

@injectable
class UserService {
  void loginUser(String email, String password) {
    // 로그인 하는 로직
  }
}

위의 예시에서는 UserService라는 클래스를 생성하였습니다. @injectable 어노테이션을 통해 해당 클래스를 의존성 주입이 가능한 모듈로 선언하였습니다.

5. 의존성 주입하기

이제 해당 모듈을 다른 클래스에서 사용하기 위해 의존성을 주입해보겠습니다. 다음과 같이 다른 클래스에서 UserService를 사용하고 싶다면:

import 'package:injectable/injectable.dart';

@Injectable()
class UserViewModel {
  final UserService userService;

  UserViewModel(this.userService);

  void login(String email, String password) {
    userService.loginUser(email, password);
  }
}

위의 예시에서는 UserViewModel이라는 클래스에서 UserService를 사용하고자 합니다. @injectable 어노테이션 대신 @Injectable() 생성자를 이용하여 의존성을 주입합니다.

6. 의존성 주입 설정하기

마지막으로, DI 컨테이너를 설정해주어야 합니다. 프로젝트의 최상위 레벨에 injectable.dart 파일을 생성하고 다음과 같이 설정해주세요:

import 'package:injectable/injectable.dart';

@InjectableInit()
void configureDependencies() => $initGetIt();

이제 의존성 주입은 완료되었습니다. Flutter 애플리케이션을 실행하고 UserViewModel을 사용하는 클래스에서 UserService의 인스턴스를 주입받을 수 있습니다.

결론

이렇게 injectinjectable 패키지를 사용하여 Flutter 애플리케이션을 모듈화하고 의존성 주입을 구현하는 방법에 대해 알아보았습니다. 이를 활용하여 애플리케이션의 유지보수성과 확장성을 개선할 수 있습니다.

더 자세한 내용은 공식 injectable 패키지 문서를 참조하시기 바랍니다. Happy coding!