[flutter] Singleton 패턴과 Injectable의 관계

소개

Singleton 패턴은 애플리케이션에서 객체의 인스턴스를 하나만 유지하는 패턴입니다. 이렇게 하면 애플리케이션 전반에서 하나의 공유된 객체를 사용할 수 있습니다. Flutter 애플리케이션에서 Singleton 패턴을 구현하는 방법 중 하나는 Injectable 패키지를 사용하는 것입니다. Injectable 패키지는 의존성 주입을 쉽게 구현할 수 있는 도구입니다. 이 패키지를 사용하면 Singleton 객체를 쉽게 생성하고 주입할 수 있습니다.

Singleton 패턴 구현하기

Singleton 패턴을 구현하려면 클래스의 생성자를 private로 선언하고, 클래스 내부에서 유일한 인스턴스를 생성해야 합니다. 이러한 인스턴스는 클래스 내부에서만 접근 가능하도록 만들어야 합니다. 그리고 클래스 내부에서는 이 유일한 인스턴스를 반환하는 메서드를 구현해야 합니다.

class Singleton {
  static final Singleton _instance = Singleton._internal();

  factory Singleton() {
    return _instance;
  }

  Singleton._internal();
}

위의 예제에서는 Singleton 클래스의 생성자를 _internal로 지정하고, _instance라는 private static 변수에 유일한 인스턴스를 저장합니다. 그리고 factory 키워드를 사용하여 인스턴스를 생성하는 팩토리 메서드를 정의합니다. 이 메서드는 _instance를 반환하도록 구현됩니다.

Injectable 패키지 사용하기

Injectable 패키지를 사용하면 Singleton 패턴을 더 쉽게 구현할 수 있습니다. 먼저, 프로젝트의 pubspec.yaml 파일에 Injectable 패키지를 추가하고, 의존성 주입 환경을 구성해야 합니다.

dependencies:
  injectable: ^1.3.0 # 실제 버전은 패키지의 가장 최신 버전을 사용하세요

그리고 프로젝트의 루트 디렉터리에 injection.dart라는 파일을 생성하고 다음과 같이 구성합니다.

@injectableInit
void configureDependencies() => $initGetIt(GetIt.instance);

@module
abstract class InjectableModule {
  @singleton
  Singleton get singleton;
}

위의 예제에서는 @injectableInit 어노테이션을 사용하여 의존성 주입 환경을 초기화합니다. 그리고 @module 어노테이션을 사용하여 Injectable 모듈을 정의합니다. 모듈 내부에서는 Singleton 객체를 정의하고, @singleton 어노테이션을 사용하여 Singleton 객체임을 명시합니다.

Singleton 객체를 사용하려면 해당 모듈을 import하고, GetIt.instance를 사용하여 Singleton 객체를 사용할 수 있습니다.

import 'injection.dart';

void main() {
  configureDependencies();
  
  final singleton = GetIt.instance<Singleton>();
  // Singleton 객체 사용하기
}

위의 예제에서는 GetIt.instance<Singleton>()을 사용하여 Singleton 객체를 가져옵니다. 이렇게 하면 Singleton 객체를 사용할 수 있습니다.

결론

Singleton 패턴은 애플리케이션 전반에서 하나의 공유된 객체를 사용해야 할 때 유용합니다. Flutter 애플리케이션에서 Singleton 패턴을 구현하기 위해 Injectable 패키지를 사용하면 의존성 주입을 쉽게 구현할 수 있습니다. 이를 통해 싱글톤 객체를 생성하고 주입하는 과정을 간단하게 처리할 수 있습니다.