개발콩블로그
[RxSwift] throttle vs debounce 본문
안녕하세요!
개발콩입니다. 오늘은 RxSwift operator 중 throttle와 debounce에 대해서 소개하도록 하겠습니다.
왜 필요할까?
우리는 앱에서 기능 개발을 할 경우 아래와 같은 상황을 마주하게 될 수 있습니다.
- 검색 버튼을 클릭하게 된다면 네트워크 요청을 합니다.
- 검색어의 입력값이 변하게 될 때마다 네트워크 요청을 합니다.
이 두가지의 경우에는 모두 사용자가 반복적으로 여러번 입력할 수 있다는 것 입니다.
if) 사용자가 버튼을 짧은 시간 내에 연타하게 된다면?
if) '사과'를 검색하기 위해서 ㅅ, 사, 삭, 사고, 사과 와 같이 짧은 시간 내의 5번의 변화가 일어나게 된다면?
불필요한 네트워크 요청을 하게 되고 이것은 서버에 부담이 될 수 있습니다.
이때 고려해볼 수 있는 것이 RxSwift operator에서 throttle와debounce입니다.
throttle
- 입력받은 즉시 값을 한번 방출합니다.
- 이벤트가 처음 방출된 시점에 지정된 타이머 기간동안 어떤 이벤트도 방출되지 않습니다.
- 이벤트가 방출될 때마다 타이머가 초기화 되지 않습니다.
.throttle(.milliseconds(3000), latest: true, scheduler: MainScheduler.instance)
latest: 타이머가 끝났을 때의 마지막 값을 한번 더 방출할 것인지 결정하는 것 입니다.
실제로 보면, 맨 처음 입력된 'ㄷ'은 바로 방출되는 것을 볼 수 있으며 3초마다 갱신되는 것을 볼 수 있습니다.
debounce
- 입력받은 값을 즉시 방출하지 않습니다.
- 이벤트가 처음 방출된 시점에 지정된 타이머 기간동안 어떤 이벤트도 방출되지 않습니다.
- 이벤트가 방출될 때마다 타이머가 초기화 됩니다.
.debounce(.milliseconds(3000), scheduler: MainScheduler.instance)
실제 예시를 보게 된다면 처음 입력도 반영되지 않는 것을 확인할 수 있었습니다.
또한, 타자입력을 멈출 때까지 UILabel이 갱신되지 않는 것을 보며 타이머가 초기화 되는 것을 볼 수 있었습니다.
결론
throttle와 debounce의 큰 차이점은 다음과 같습니다.
- 처음 방출되는 값이 바로 반영이 되는가?
- 타이머가 초기화 되는가?
이러한 차이점을 잘 인지하고 적절한 상황에서 사용하는 것이 중요할 것 같습니다.
'RxSwift' 카테고리의 다른 글
[RxSwift] PublishRelay, BehaviorRelay, ReplayRelay (0) | 2025.02.27 |
---|---|
[RxSwift] PublishSubject, BehaviorSubject, ReplaySubject, AsyncSubject (0) | 2025.02.26 |
[RxSwift] ObservableType과 ObserverType (0) | 2025.02.25 |
[RxSwift] RxSwift의 시작 Observable & Observer (0) | 2025.02.24 |
[RxSwift] zip vs combineLatest (0) | 2025.02.18 |