guricode

[Flutter]스로틀링, 디바운싱 본문

앱/Flutter&Dart

[Flutter]스로틀링, 디바운싱

agentrakugaki 2025. 10. 20. 02:04

스로틀링과 디바운싱은 사용자 이벤트 제어성능 최적화에 관한 내용이다.

 

스로틀링(Throttling)은 이벤트가 자주 발생해도 일정시간 간격으로만 실행되도록 제한하는기법이다.

스크롤 드래그 api 호출 등에서 과도한 호출을 막아 성능을 최적하 하기 위함이다.

보통 마지막 실행후 일정시간이 지난 후 실행하도록 하는 방법을 사용한다.

import 'dart:async';

class Throttler {
  Throttler(this.delay);
  final Duration delay;
  Timer? _timer;
  bool _ready = true;

  void run(void Function() action) {
    if (_ready) {
      _ready = false;
      action();
      _timer = Timer(delay, () => _ready = true);
    }
  }
}

// 사용 예시
final throttler = Throttler(const Duration(seconds: 1));

// 예: 스크롤 이벤트나 버튼 클릭 제한
onPressed: () => throttler.run(() {
  print('1초에 한 번만 실행됩니다.');
});

 

 

디바운싱(Debouncing)은 이벤트가 연속적으로 발생하면 마지막 이벤트 이후 일정 시간이 지나야 실행되는 기법이다.

사용자가 입력을 빠르게 연속적으로 할때, 마지막 입력이 끝난 뒤 한번만 처리하기 위해 사용한다.

이벤트가 계쏙 들어오면 타이머를 리셋하고, 입력이 멈춘 위 동작을 실행한다.

import 'dart:async';

class Debouncer {
  Debouncer(this.delay);
  final Duration delay;
  Timer? _timer;

  void run(void Function() action) {
    _timer?.cancel();
    _timer = Timer(delay, action);
  }
}

// 사용 예시
final debouncer = Debouncer(const Duration(milliseconds: 500));

// 예: 검색창 입력
onChanged: (text) {
  debouncer.run(() {
    print('사용자 입력 완료: $text');
  });
};

 

 

스로틀링은 이벤트 발생 빈도를 “주기적으로 제한”하고,
디바운싱은 “마지막 이벤트 후 일정 시간이 지나야 실행”되는 방식이다.