[flutter] 플러터에서 Inject와 Injectable을 사용하는 예제 프로젝트

소개

이번 포스트에서는 플러터에서 의존성 주입을 위해 사용되는 Inject와 Injectable 라이브러리를 사용하는 예제 프로젝트를 소개하려고 합니다.

의존성 주입은 프로젝트의 복잡성을 낮추고 코드의 재사용성을 높여주는 중요한 개념입니다. Inject와 Injectable은 이러한 의존성 주입을 효과적으로 처리할 수 있는 플러터 라이브러리입니다.

필요한 패키지 설치

먼저, 해당 예제 프로젝트를 구현하기 위해서는 Inject와 Injectable 패키지를 설치해야 합니다. 이를 위해 pubspec.yaml 파일에 다음과 같이 의존성을 추가해주세요.

dependencies:
  ...
  injectable: ^1.4.3
  injectable_generator: ^1.4.3

위와 같이 의존성을 추가한 뒤, flutter pub get 명령어를 실행하여 패키지를 설치합니다.

예제 프로젝트 구조

이번 예제 프로젝트에서는 간단한 ToDo 애플리케이션을 구현합니다. ToDo를 추가, 수정, 삭제할 수 있는 기능을 구현하며, 이를 위해 Inject와 Injectable 패키지를 사용합니다.

프로젝트의 구조는 다음과 같이 구성됩니다.

- lib
  - models
    - todo.dart
  - repositories
    - todo_repository.dart
  - services
    - todo_service.dart
  - main.dart

코드 구현

1. 모델 클래스 작성

‘lib/models/todo.dart’ 파일을 생성하고 다음과 같이 ToDo 모델 클래스를 작성합니다.

class Todo {
  final String id;
  final String title;
  final String description;

  Todo({required this.id, required this.title, required this.description});
}

2. 레포지토리 클래스 작성

‘lib/repositories/todo_repository.dart’ 파일을 생성하고 다음과 같이 ToDo 레포지토리 클래스를 작성합니다.

import 'package:injectable/injectable.dart';
import 'package:todo_app/models/todo.dart';

@injectable
class TodoRepository {
  List<Todo> _todos = [];

  List<Todo> get todos => _todos;

  void addTodo(Todo todo) {
    _todos.add(todo);
  }

  void updateTodo(Todo todo) {
    _todos.removeWhere((element) => element.id == todo.id);
    _todos.add(todo);
  }

  void deleteTodoById(String id) {
    _todos.removeWhere((element) => element.id == id);
  }
}

3. 서비스 클래스 작성

‘lib/services/todo_service.dart’ 파일을 생성하고 다음과 같이 ToDo 서비스 클래스를 작성합니다.

import 'package:injectable/injectable.dart';
import 'package:todo_app/models/todo.dart';
import 'package:todo_app/repositories/todo_repository.dart';

@injectable
class TodoService {
  final TodoRepository _todoRepository;

  TodoService(this._todoRepository);

  List<Todo> get todos => _todoRepository.todos;

  void addTodo(Todo todo) {
    _todoRepository.addTodo(todo);
  }

  void updateTodo(Todo todo) {
    _todoRepository.updateTodo(todo);
  }

  void deleteTodoById(String id) {
    _todoRepository.deleteTodoById(id);
  }
}

4. 메인 파일 수정

‘lib/main.dart’ 파일을 열고 다음과 같이 코드를 수정합니다.

import 'package:flutter/material.dart';
import 'package:injectable/injectable.dart';
import 'package:todo_app/services/todo_service.dart';

import 'di.config.dart';

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

@injectable
class MyApp extends StatelessWidget {
  final TodoService _todoService;

  MyApp(this._todoService);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'ToDo App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('ToDo App'),
        ),
        body: SingleChildScrollView(
          child: Column(
            children: _todoService.todos
                .map((todo) => ListTile(
                      title: Text(todo.title),
                      subtitle: Text(todo.description),
                    ))
                .toList(),
          ),
        ),
      ),
    );
  }
}

5. 의존성 주입 설정

프로젝트 루트 디렉토리에 ‘injectable.dart’ 파일을 생성하고 다음과 같이 코드를 작성합니다.

// injectable.dart

import 'package:injectable/injectable.dart';
import 'package:todo_app/di.iconfig.dart';

@InjectableInit()
void configureDependencies() {
  $initGetIt(getIt);
}

다음으로, 프로젝트 루트 디렉토리에 ‘di.config.dart’ 파일을 생성하고 다음과 같이 코드를 작성합니다.

// di.config.dart

import 'package:injectable/injectable.dart';
import 'package:todo_app/di.dart';
import 'package:todo_app/services/todo_service.dart';
import 'package:todo_app/repositories/todo_repository.dart';

@InjectableInit()
void configureDependencies() => $initGetIt();

6. 코드 생성

터미널에서 flutter pub run build_runner build 명령어를 실행하여 코드를 생성합니다. 이 명령어를 실행하면 ‘lib/di.iconfig.dart’ 파일과 ‘lib/di.config.dart’ 파일이 생성됩니다.

7. 실행

이제 예제 프로젝트를 실행해볼 차례입니다. flutter run 명령어를 실행하여 애플리케이션을 실행합니다. ToDo가 추가되면 화면에 표시되는 것을 확인할 수 있을 것입니다.

결론

이번 포스트에서는 플러터에서 Inject와 Injectable을 사용하는 예제 프로젝트를 소개했습니다. 의존성 주입을 효과적으로 처리하는 Inject와 Injectable은 플러터 개발에서 유용하게 사용될 수 있는 라이브러리입니다.