[flutter] 플러터에서 Provider를 이용한 의존성 주입

의존성 주입(Dependency Injection)은 앱 내에서 객체들 간의 의존 관계를 관리하기 위한 디자인 패턴입니다. 의존성 주입을 효과적으로 구현하는 방법 중 하나는 Provider를 사용하는 것입니다. 이번 포스트에서는 플러터에서 Provider를 이용하여 의존성 주입을 어떻게 구현하는지 알아보겠습니다.

Provider 패키지 추가하기

먼저, 플러터 프로젝트에 Provider 패키지를 추가해야 합니다. pubspec.yaml 파일을 열고 dependencies 섹션에 다음 코드를 추가하세요.

dependencies:
  flutter:
    sdk: flutter
  provider: ^4.3.3

위 코드에서는 Provider 패키지의 버전을 4.3.3으로 지정했습니다. 필요에 따라 적절한 버전을 선택해 주세요. 그리고 패키지를 가져오기 위해 터미널에서 flutter packages get 명령을 실행해야 합니다.

Provider 설정하기

Provider 패키지를 추가한 후, 의존성 주입을 할 클래스나 객체를 정의하고 Provider를 설정해줘야 합니다. 일반적으로는 main.dart 파일에서 Provider를 설정하는 것이 좋습니다.

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:my_app/my_class.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (context) => MyClass(),
      child: MaterialApp(
        title: 'My App',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: HomeScreen(),
      ),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final myClass = Provider.of<MyClass>(context);
    
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: Center(
        child: Text(myClass.someData),
      ),
    );
  }
}

위 코드에서 MyClass는 의존성 주입 대상 클래스입니다. create 메소드에 의존성 주입을 할 객체인 MyClass를 인스턴스화하여 설정해줍니다. 이후 Provider.of<MyClass>(context)를 사용하여 해당 객체를 사용할 수 있습니다. 이렇게 Provider로 설정된 의존성은 하위 위젯에서도 사용할 수 있게 됩니다.

Provider 사용하기

Provider로 의존성 주입이 된 객체를 사용하려면 Provider.of<T>(context)를 사용하여 해당 객체를 가져와 사용하면 됩니다. 위 코드에서는 HomeScreen 위젯에서 MyClass 객체를 사용하고 있습니다.

final myClass = Provider.of<MyClass>(context);

final myClass 변수는 HomeScreen 위젯에서 MyClass 객체를 사용하기 위해 선언한 것이며, Provider.of<MyClass>(context)를 통해 해당 객체를 가져옵니다. 이제 myClass 변수를 통해 MyClass 객체의 메소드나 변수에 접근할 수 있습니다.

결론

플러터에서 Provider를 활용하여 의존성 주입을 구현하는 방법에 대해 알아보았습니다. Provider를 사용하면 객체 간의 의존성을 효과적으로 관리할 수 있으며, 코드의 가독성과 유지보수성을 향상시킬 수 있습니다. 의존성 주입을 효과적으로 사용하여 앱 개발을 더욱 효율적으로 진행해보세요.

참고 자료