[flutter] 플러터에서 Injectable을 사용한 코드 모듈화 방법

플러터(Flutter)는 구글에서 개발한 모바일 애플리케이션 개발 프레임워크로, 하나의 코드베이스로 iOS와 Android 앱을 개발할 수 있습니다. 하지만 프로젝트가 커지면서 코드를 모듈화하고 의존성을 관리하는 것이 중요해집니다.

이때 Injectable이라는 라이브러리를 사용하면 효과적으로 코드를 모듈화할 수 있습니다. Injectable은 플러터 애플리케이션에서 의존성 주입을 쉽게 구현할 수 있도록 도와주는 라이브러리입니다.

Injectable 라이브러리 설치

플러터 프로젝트에서 Injectable 라이브러리를 사용하기 위해 먼저 아래와 같이 injectable 패키지를 pubspec.yaml 파일에 추가해야 합니다.

dependencies:
  injectable: ^1.0.0

다음으로 pub get 명령을 실행하여 의존성을 업데이트합니다.

Injectable 모듈 생성

Injectable을 사용하기 위해 모듈을 생성해야 합니다. 모듈은 특정 클래스들의 의존성을 정의하고 관리하는 역할을 합니다.

우선, app_module.dart과 같은 파일을 생성한 후, 아래와 같이 코드를 작성합니다.

import 'package:injectable/injectable.dart';

@module
abstract class AppModule {
  // 예시: UserRepository 의존성 주입
  @lazySingleton
  UserRepository get userRepository => UserRepository();
}

위 예시에서는 UserRepository라는 클래스를 싱글톤으로 주입하도록 정의하였습니다. 싱글톤으로 주입되므로 애플리케이션 전체에서 동일한 인스턴스를 사용할 수 있습니다.

추가로, 다른 의존성을 정의하려면 @lazySingleton, @singleton, @preResolve 등의 어노테이션을 사용할 수 있습니다.

의존성 주입

Injectable 모듈을 생성한 후, 해당 모듈을 사용하여 의존성을 주입할 수 있습니다. 아래와 같이 Injectable을 사용할 클래스에서 @injectable 어노테이션을 추가합니다.

import 'package:injectable/injectable.dart';

@injectable
class UserRepository {
  // ...
}

이렇게 어노테이션이 추가된 클래스는 필요한 곳에서 주입을 받을 수 있습니다. 예를 들어, main.dart 파일에서 UserRepository를 사용하려면 아래와 같이 코드를 작성합니다.

import 'package:flutter/material.dart';
import 'package:injectable/injectable.dart';
import 'app_module.dart';

void main() {
  configureInjection(AppModule());
  runApp(MyApp());
}

@injectable
class MyApp extends StatelessWidget {
  final UserRepository userRepository;

  MyApp({required this.userRepository});

  @override
  Widget build(BuildContext context) {
    // ...
  }
}

위 예시에서는 AppModule을 사용하여 configureInjection() 함수를 호출하고, MyApp 클래스에서 UserRepository를 주입받아 사용하고 있습니다.

결론

플러터에서 Injectable 라이브러리를 사용하여 코드를 모듈화하고 의존성을 관리하는 방법을 알아보았습니다. Injectable을 이용하면 플러터 프로젝트의 복잡성을 줄이고 유지 보수를 쉽게 할 수 있습니다.

더 자세한 내용은 Injectable 공식 문서를 참고해주세요.