[flutter] Injectable을 사용하여 플러터 앱의 비즈니스 로직 분리 방법

안녕하세요! 이번에는 플러터(Flutter) 앱의 비즈니스 로직을 분리하는 방법에 대해 알아보겠습니다. 비즈니스 로직을 분리하면 코드의 가독성과 유지보수성을 높일 수 있으며, 테스트도 쉽게 진행할 수 있습니다. 이를 위해 “injectable” 패키지를 사용하겠습니다.

Injectabble 패키지란?

“injectable”은 플러터 앱에서 의존성 주입을 쉽게 구현할 수 있도록 도와주는 패키지입니다. 이를 통해 앱의 비즈니스 로직을 모듈화하고 의존성을 관리할 수 있습니다.

설치

“injectable” 패키지를 사용하기 위해서는 먼저 해당 패키지를 프로젝트에 추가해야 합니다. pubspec.yaml 파일의 dependencies에 다음 코드를 추가하세요:

dependencies:
  injectable: ^1.0.0

그리고 터미널에서 다음 명령어를 실행하여 패키지를 설치하세요:

flutter pub get

사용 방법

1. 모듈 생성

먼저, 비즈니스 로직을 담을 모듈을 생성해야 합니다. lib 폴더 내에 di 폴더를 생성하고, di 폴더 내에 app_module.dart 파일을 생성하세요.

import 'package:injectable/injectable.dart';

@module
abstract class AppModule {}

2. 의존성 주입

이제 의존성 주입을 적용할 클래스를 생성해보겠습니다. di 폴더 내에 example_service.dart 파일을 생성하고 다음 코드를 작성하세요.

abstract class ExampleService {
  void doSomething();
}

@Injectable(as: ExampleService)
class ExampleServiceImpl implements ExampleService {
  @override
  void doSomething() {
    print("Doing something");
  }
}

위의 예시에서는 ExampleService 인터페이스와 ExampleServiceImpl 클래스를 생성하고, @Injectable 어노테이션을 사용하여 의존성 주입을 적용하였습니다. ExampleServiceImpl 클래스는 ExampleService 인터페이스를 구현하며, doSomething 메소드를 오버라이드하여 로그를 출력하는 동작을 수행합니다.

3. 모듈 등록

이제 앞서 생성한 AppModule에서 의존성을 등록해보겠습니다. AppModule 클래스에는 @module 어노테이션이 필요합니다. AppModule 내에서 configure 메소드를 생성하고 의존성을 등록합니다.

@module
abstract class AppModule {

  @singleton
  ExampleService get exampleService => ExampleServiceImpl();
  
  // 추가적인 의존성 등록
}

위 예시에서는 ExampleServiceExampleServiceImpl로 구현하고, @singleton 어노테이션을 사용하여 해당 의존성이 싱글톤으로 사용된다고 정의하였습니다.

4. 주입 사용

이제 앱에서 해당 의존성을 사용할 수 있습니다. 기존에 의존성을 직접 생성했던 위치를 get_it 패키지의 getIt 인스턴스를 통해 주입을 받도록 변경합니다. lib/main.dart 파일에서 다음과 같이 수정해보세요.

import 'package:injectable/injectable.dart';

void main() {
  configureDependencies(Environment.prod);
  runApp(MyApp());
}

@injectableInit
void configureDependencies(String environment) {
  $initGetIt(Injector(environment: environment));
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final exampleService = getIt.get<ExampleService>();
    exampleService.doSomething();
    // ...
  }
}

위의 예시에서는 configureDependencies 메소드에서 의존성을 설정하고, MyApp 클래스에서 해당 의존성을 주입하여 사용하였습니다.

결론

위의 예시를 통해 “injectable” 패키지를 사용하여 플러터 앱의 비즈니스 로직을 간단히 분리하는 방법을 알아보았습니다. “injectable”을 사용하면 코드의 가독성과 유지보수성을 높여줄 뿐만 아니라, 테스트도 쉽게 진행할 수 있습니다. 이러한 장점을 활용하여 개발 효율성을 높이세요!

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