[flutter] 플러터에서 기존 코드를 Injectable을 활용하여 리팩토링하는 방법

개요

기존의 코드를 리팩토링하면서 의존성 주입(Dependency Injection) 패턴을 적용하고 싶다면, Injectable 패키지를 사용할 수 있습니다. Injectable은 플러터 애플리케이션에서 의존성을 쉽게 관리하고 제어하기 위한 도구입니다. 이 글에서는 Injectable을 활용하여 기존 코드를 리팩토링하는 방법을 알아보겠습니다.

단계별 설명

단계 1: Injectable 패키지 추가

먼저, 프로젝트의 pubspec.yaml 파일에 Injectable 패키지를 추가해야 합니다. 아래와 같이 dependencies 섹션에 Injectable을 추가합니다.

dependencies:
  injectable: ^1.0.0

패키지를 추가한 후에는 터미널에서 flutter pub get 명령어를 실행하여 패키지를 다운로드 받습니다.

단계 2: 주입 가능한 클래스 생성

리팩토링을 원하는 클래스에 대해 주입 가능한 클래스로 변경해야 합니다. 클래스 위에 @injectable 어노테이션을 추가하고, 주입받을 인자들을 @factoryMethod 어노테이션으로 지정합니다.

import 'package:injectable/injectable.dart';

@injectable
class MyService {
  @factoryMethod // 주입받을 인자
  MyService();
}

단계 3: AppModule 생성

Injectable을 설정한 클래스들을 등록하고 의존성 관리를 위한 AppModule을 생성합니다. 일반적으로 app_module.dart 라는 이름으로 작성합니다. AppModule은 주입 가능한 클래스들을 등록하는 역할을 합니다.

import 'package:injectable/injectable.dart';
import 'package:example/my_service.dart';

@module
abstract class AppModule {
  @factoryMethod
  MyService get myService;
}

단계 4: 코드에서 사용하기

이제 주입 가능한 클래스를 다른 곳에서 사용할 수 있게 변경해야 합니다. 기존에 의존성을 하드코딩한 부분을 수정하여 주입 가능한 클래스를 사용하도록 변경합니다.

import 'package:flutter/material.dart';
import 'package:injectable/injectable.dart';
import 'package:example/my_service.dart';

@injectable
class MyWidget extends StatelessWidget {
  final MyService myService;

  MyWidget(this.myService);

  @override
  Widget build(BuildContext context) {
    // 주입받은 MyService 사용
    return Container();
  }
}

단계 5: main 함수에서 AppModule 설정

마지막으로, main 함수에서 AppModule을 설정해야 합니다. runApp 함수를 호출하기 전에 configureInjection 함수를 호출하여 AppModule을 설정합니다.

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

결론

Injectable을 활용하여 기존 코드를 리팩토링하면서 의존성 주입 패턴을 적용할 수 있습니다. 이를 통해 코드의 유지보수성과 테스트 용이성을 개선할 수 있습니다.

참고 자료