[flutter] 플러터 Riverpod를 사용한 의존성 주입 예제

의존성 주입은 앱 개발에서 중요한 개념 중 하나입니다. 의존성 주입은 앱 컴포넌트 간의 의존성을 외부에서 주입하여 코드의 재사용성과 테스트 용이성을 높여줍니다.

Flutter에서는 다양한 의존성 주입 라이브러리들이 있지만, 이 예제에서는 Riverpod를 사용한 의존성 주입 방법을 알아보겠습니다.

Riverpod란?

Riverpod는 상태 관리 라이브러리인 Provider의 새로운 버전입니다. Provider의 개선된 버전으로, 의존성 주입을 좀 더 간편하고 직관적으로 구현할 수 있게 해줍니다.

설치

Riverpod를 사용하기 위해서는 프로젝트의 pubspec.yaml 파일에 다음과 같이 의존성을 추가해야 합니다.

dependencies:
  flutter:
    sdk: flutter
  riverpod: ^1.0.0

예제 코드

이제 Riverpod를 사용하여 의존성 주입을 하는 예제를 살펴보겠습니다. 이 예제에서는 UserRepositoryUserNotifier를 의존성 주입하고, 위젯 트리에 제공하는 방법을 알아보겠습니다.

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

class UserRepository {
  String getCurrentUser() {
    // 현재 사용자를 가져오는 비즈니스 로직
    return "John Doe";
  }
}

class UserNotifier extends ChangeNotifier {
  final UserRepository _userRepository;

  UserNotifier(this._userRepository);

  String get currentUser => _userRepository.getCurrentUser();
}

final userRepositoryProvider = Provider<UserRepository>((ref) {
  return UserRepository();
});

final userNotifierProvider = ChangeNotifierProvider<UserNotifier>((ref) {
  final userRepository = ref.watch(userRepositoryProvider);
  return UserNotifier(userRepository);
});

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ProviderScope(
      child: MaterialApp(
        title: 'Flutter Riverpod Example',
        home: Scaffold(
          appBar: AppBar(
            title: Text('User Management'),
          ),
          body: Consumer(
            builder: (context, watch, _) {
              final userNotifier = watch(userNotifierProvider);
              final currentUser = userNotifier.currentUser;
              return Center(
                child: Text(
                  'Current User: $currentUser',
                  style: TextStyle(fontSize: 18),
                ),
              );
            },
          ),
        ),
      ),
    );
  }
}

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

위 예제 코드에서 UserRepository는 실제 사용자 데이터를 처리하는 비즈니스 로직을 담고 있습니다. UserNotifierUserRepository를 의존성으로 받아와서 사용자 데이터에 관련된 상태 관리를 합니다.

userRepositoryProviderProvider<UserRepository>로, UserNotifier에서 사용할 UserRepository를 제공합니다. userNotifierProviderChangeNotifierProvider<UserNotifier>로, UserNotifier의 인스턴스를 생성하고 UserRepository를 주입하여 제공합니다.

MyApp 위젯에서는 ProviderScopeuserNotifierProvider가 사용 가능하도록 설정합니다. 그리고 Consumer 위젯 안에서 userNotifierProvider를 감지하고 현재 사용자 데이터를 가져오는 로직을 수행합니다.

결론

이 예제에서는 Riverpod를 사용하여 Flutter에서 의존성 주입을 어떻게 구현하는지 배웠습니다. Riverpod는 Provider과 같은 상태 관리 라이브러리를 사용하면서 의존성 주입을 더욱 간편하고 유지보수하기 좋게 만들어줍니다. 앱 개발에서 의존성 주입을 효율적으로 사용하여 개발의 생산성을 높여보세요.

참고 자료