[flutter] 플러터 RxDart에서의 메모리 관리 방법

소개

RxDart는 Dart 언어용 리액티브 프로그래밍 확장 라이브러리입니다. 이 라이브러리를 사용하면 Dart 앱에서 데이터 흐름을 다루기 위해 Observable, Stream, Subject 등과 같은 주요 리액티브 개념을 활용할 수 있습니다. 그렇다면 플러터 앱에서 RxDart를 사용할 때 어떻게 메모리 관리를 해야 할까요? 이 글에서는 RxDart에서 메모리 관리를 위한 몇 가지 팁과 지침을 소개하겠습니다.

1. Dispose를 통한 자원 해제

RxDart는 구독을 위해 메모리를 사용합니다. 앱에서 옵저버블(observable)을 생성하고 구독(subscribe)하면 메모리가 할당됩니다. 그러므로 옵저버블의 사용이 끝나면 반드시 dispose를 호출하여 메모리를 해제해야 합니다. 예를 들어, StatefulWidget의 dispose 메서드에서 옵저버블의 dispose 메서드를 호출하는 것은 좋은 습관입니다.

class MyWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => MyWidgetState();
}

class MyWidgetState extends State<MyWidget> {
  final BehaviorSubject<String> _subject = BehaviorSubject<String>();

  @override
  void dispose() {
    _subject.close();
    super.dispose();
  }

  // ...
}

2. takeUntil을 사용한 자원 해제

RxDart는 takeUntil 연산자를 제공합니다. 이 연산자를 사용하면 특정 조건이 충족할 때 옵저버블을 자동으로 해제할 수 있습니다. 이를 활용하여 앱 상태에 따라 옵저버블이 자동으로 종료되도록 할 수 있습니다. 예를 들어, 다음 코드는 플러터의 WidgetsBindingObserver를 사용하여 앱이 비활성화 될 때 옵저버블을 해제합니다.

class MyWidget extends StatefulWidget with WidgetsBindingObserver {
  final BehaviorSubject<String> _subject = BehaviorSubject<String>();

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    _subject.close();
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.inactive) {
      _subject.close();
    }
  }

  // ...
}

3. StreamSubscription의 적절한 사용

RxDart를 사용하여 옵저버블을 구독할 때, StreamSubscription을 사용하게 됩니다. 이 경우, StreamSubscription의 cancel 메서드를 호출하여 구독을 해제할 수 있습니다. 하지만 주의해야 할 점은 StreamSubscription은 한 번 취소되면 다시 사용할 수 없다는 것입니다. 따라서, 새로운 옵저버블을 구독할 때마다 새로운 StreamSubscription 객체를 생성해야 합니다.

StreamSubscription<dynamic> _subscription;

// ...

void subscribe() {
  _subscription?.cancel(); // 이전 구독을 취소합니다.

  _subscription = myObservable.listen((data) {
    // 데이터 처리
  });
}

결론

RxDart를 사용하여 플러터 앱을 개발할 때는 메모리 관리에 신경을 써야 합니다. Dispose를 통한 자원 해제, takeUntil을 사용한 자원 해제, 그리고 StreamSubscription의 적절한 사용은 메모리 누수를 방지하기 위한 중요한 방법입니다. 앱의 규모와 요구 사항에 따라 적절한 메모리 관리 방법을 선택하여 안정적이고 성능 향상된 앱을 개발할 수 있습니다.

참고자료