[flutter] Injectable을 활용하여 플러터 앱의 인터페이스 통일화하기

플러터(Flutter)는 Google에서 개발한 모바일 앱 개발 프레임워크로, 다양한 플랫폼에서 동일한 UI를 제공할 수 있습니다. 하지만, 대규모 앱 개발 프로젝트에서는 여러 모듈과 클래스가 함께 동작해야 하는 경우가 많아집니다. 이 때, 각 모듈과 클래스 간에 인터페이스를 통일화하여 코드의 가독성과 유지 보수성을 높일 수 있습니다.

이번 글에서는, 플러터 앱에서 injectable 라이브러리를 사용하여 인터페이스를 통일화하는 방법에 대해 알아보겠습니다.

injectable 라이브러리란?

injectable 라이브러리는 의존성 주입(Dependency Injection)을 쉽게 구현할 수 있도록 도와주는 툴입니다. 이를 사용하면 코드의 유연성과 확장성을 높일 수 있으며, 테스트와 유지 보수를 용이하게 할 수 있습니다.

인터페이스를 정의하기

먼저, 플러터 앱에서 통일화할 인터페이스를 정의해야 합니다. 예를 들어, 데이터베이스에 접근하는 인터페이스를 통일화해보겠습니다.

abstract class DatabaseService {
  Future<List<User>> getUsers();
  Future<void> createUser(User user);
}

위 코드에서는 DatabaseService라는 추상 클래스를 선언하였습니다. 이 클래스는 getUserscreateUser라는 두 개의 메서드를 정의하고 있습니다.

인터페이스를 구현하기

다음으로, 인터페이스를 구현하는 클래스를 작성해야 합니다. 예를 들어, 데이터베이스에 대한 실제 구현체를 만들어보겠습니다.

class DatabaseServiceImpl implements DatabaseService {
  @override
  Future<List<User>> getUsers() {
    // 데이터베이스에서 사용자 목록을 가져오는 로직
  }

  @override
  Future<void> createUser(User user) {
    // 사용자를 데이터베이스에 저장하는 로직
  }
}

위 코드에서는 DatabaseServiceImpl이라는 클래스를 선언하였습니다. 이 클래스는 DatabaseService 인터페이스를 구현하고 있으며, getUserscreateUser 메서드를 재정의하였습니다.

injectable을 통한 의존성 주입 설정하기

이제 injectable 라이브러리를 사용하여 의존성 주입을 설정해보겠습니다. 먼저, injectable 라이브러리를 프로젝트에 추가해야 합니다. pubspec.yaml 파일의 dependencies 항목에 다음과 같이 injectable 패키지를 추가합니다.

dependencies:
  flutter:
    sdk: flutter
  injectable: ^1.4.0
  ...

다음으로, main.dart 파일에서 injectable을 초기화하고 의존성을 등록해야 합니다. 아래는 간단한 예시입니다.

import 'package:injectable/injectable.dart';

@injectableInit
void configureInjection(String environment) => $initGetIt(environment: environment);

configureInjection 함수는 injectable에서 가장 먼저 호출되어야 하는 초기화 함수입니다. 여기에서 의존성을 등록합니다.

의존성 주입하기

모든 설정이 완료되었다면, 의존성을 주입하여 사용할 수 있습니다. 의존성을 주입하는 방법은 다양하지만, 가장 일반적인 방법은 생성자 주입(Constructor Injection)입니다.

class UserService {
  final DatabaseService databaseService;

  UserService(this.databaseService);

  Future<void> createUser(User user) async {
    await databaseService.createUser(user);
  }
}

위 코드에서는 UserService라는 클래스를 선언하고, 생성자에서 DatabaseService를 주입받고 있습니다. 이제 UserService 클래스에서 databaseService를 사용하여 데이터베이스에 사용자를 생성할 수 있습니다.

마무리

위에서는 injectable 라이브러리를 사용하여 플러터 앱의 인터페이스 통일화 방법을 알아보았습니다. 이를 통해 코드의 가독성과 유지 보수성을 높일 수 있으며, 테스트와 확장성을 개선할 수 있습니다. 또한, injectable을 사용하면 의존성 주입을 쉽게 구현할 수 있어 플러터 앱 개발을 더욱 효율적으로 진행할 수 있습니다.

참고 자료