Swift로 Debounce 함수 직접 구현하기: 단계별 가이드

작성일 :

Swift로 Debounce 함수 직접 구현하기: 단계별 가이드

Swift 개발을 하다 보면 이벤트 핸들링을 효율적으로 처리해야 하는 경우가 빈번하게 발생합니다. 특히 사용자 입력이나 네트워크 요청과 같이 빠르게 반복되는 이벤트를 적절히 제어하는 것이 중요합니다. 여기서 Debounce 함수는 주기적으로 발생하는 이벤트를 그룹화하여 짧은 시간 내에 여러 번 발생하는 이벤트를 하나로 축소하는 역할을 합니다. 이번 글에서는 Swift로 직접 Debounce 함수를 구현하는 방법을 단계별로 알아보도록 하겠습니다.

Debounce란?

Debounce는 사용자가 지정한 시간 간격 내에 여러 번 호출된 동일한 함수가 마지막 호출만 실행되도록 하는 기술입니다. Debounce를 사용하면 빠르게 연달아 발생하는 이벤트를 제한하여, 성능을 최적화하고 불필요한 작업을 줄일 수 있습니다.

예를 들어, 사용자가 입력란에 텍스트를 입력할 때마다 네트워크 요청을 보내는 대신, 입력이 멈춘 후 일정 시간 동안 추가 입력이 없으면 네트워크 요청을 보내도록 할 수 있습니다. 이를 통해 서버 부하를 줄이고 응답성을 개선할 수 있습니다.

Swift로 Debounce 구현하기

이제 Swift로 Debounce 함수를 직접 구현해 보겠습니다. 이 예제에서는 GCD(Grand Central Dispatch)를 사용하여 간단하고 효율적인 Debounce를 구현할 것입니다.

1. 기본 구조 설정

먼저, Debounce 함수를 정의하기 위한 클래스를 생성합니다.

swift
import Foundation

class Debouncer {
    private let queue: DispatchQueue
    private var workItem: DispatchWorkItem?
    private var interval: TimeInterval
    
    init(interval: TimeInterval, queue: DispatchQueue = .main) {
        self.interval = interval
        self.queue = queue
    }
    
    func debounce(action: @escaping () -> Void) {
        // 구현 부분은 나중에 채워집니다.
    }
}

2. debounce 메서드 구현

debounce 메서드는 주어진 action을 일정 시간이 지난 후에 호출하도록 구현합니다. 이전의 작업이 있다면 취소하고, 새로운 작업을 예약합니다.

swift
class Debouncer {
    // ... (기존 코드)

    func debounce(action: @escaping () -> Void) {
        workItem?.cancel()
        workItem = DispatchWorkItem(block: action)
        queue.asyncAfter(deadline: .now() + interval, execute: workItem!)
    }
}

3. 사용 예제

이제 Debouncer 클래스를 실제로 어떻게 사용하는지 살펴보겠습니다. 텍스트 필드의 입력을 디바운싱하여 네트워크 요청 횟수를 줄이는 간단한 예제를 작성합니다.

swift
let debouncer = Debouncer(interval: 0.5)

func textFieldDidChange(_ textField: UITextField) {
    debouncer.debounce {
        sendNetworkRequest(with: textField.text)
    }
}

func sendNetworkRequest(with text: String?) {
    // 네트워크 요청 구현
    print("Network request sent with text: \(text ?? "")")
}

4. 추가 기능: 파라미터 지원

때때로 Debounce 함수가 실행될 때 파라미터를 전달할 필요가 있습니다. 이를 위해 debounce 메서드를 제너릭으로 만들어 파라미터를 지원하도록 변경합니다.

swift
class Debouncer {
    // ... (기존 코드)
    
    func debounce<T>(parameter: T, action: @escaping (T) -> Void) {
        workItem?.cancel()
        workItem = DispatchWorkItem { action(parameter) }
        queue.asyncAfter(deadline: .now() + interval, execute: workItem!)
    }
}

이제 파라미터를 사용하여 debounce 메서드를 호출할 수 있습니다.

swift
func textFieldDidChange(_ textField: UITextField) {
    debouncer.debounce(parameter: textField.text) { text in
        sendNetworkRequest(with: text)
    }
}

결론

이번 글에서는 Swift로 Debounce 함수를 직접 구현하는 방법을 알아보았습니다. Debouncer 클래스를 사용하여 반복적인 이벤트를 제어하고 성능을 최적화하는 방법을 단계별로 설명하였습니다. 이 기술을 활용하면 앱의 성능을 크게 향상시킬 수 있습니다. 앞으로 다양한 상황에서 Debounce를 적용해 보시기 바랍니다.