[swift] 네트워킹 관련 디자인 패턴

네트워킹은 iOS 앱에서 중요한 기능 중 하나입니다. 네트워킹을 구현할 때 코드를 재사용하고 유지 보수하기 쉽도록 하는 디자인 패턴을 사용하는 것이 좋습니다. 이를 통해 앱의 다양한 부분에서 일관된 네트워킹 솔루션을 사용할 수 있으며, 앱이 크기가 커질수록 유용하게 사용됩니다.

Singleton 패턴

네트워킹을 단 한 곳에서 관리하고 싶을 때 Singleton 패턴을 활용합니다. URLSession과 같은 네트워킹 객체 또는 네트워킹 상태를 담는 객체를 Singleton으로 만들어 여러 곳에서 공유하여 사용할 수 있습니다.

class NetworkManager {
  static let shared = NetworkManager()

  private init() { }

  func fetchData(from url: URL, completion: (Data?, Error?) -> Void) {
    // 네트워킹 데이터를 가져오는 로직
  }
}

Delegate 패턴

네트워킹 작업의 진행 상황을 관리하거나 결과를 받아오고 싶을 때 Delegate 패턴을 사용합니다. 네트워킹매니저 클래스에서 프로토콜을 정의하고, 해당 프로토콜을 채택한 클래스에서 네트워킹 작업의 결과를 받아올 수 있습니다.

protocol NetworkManagerDelegate: AnyObject {
  func didCompleteFetch(data: Data)
  func didFailWithError(error: Error)
}

class NetworkManager {
  weak var delegate: NetworkManagerDelegate?

  func fetchData(from url: URL) {
    // 네트워킹 데이터를 가져오는 로직
    // 작업이 완료되면 delegate를 통해 결과를 전달
  }
}

모델-뷰-뷰모델 (MVVM) 패턴

네트워킹을 뷰모델로 추상화하여 네트워킹 로직과 뷰 로직을 분리하는 모델-뷰-뷰모델 패턴을 활용할 수 있습니다. 네트워킹은 뷰모델에 의해 관리되고 뷰모델은 뷰에 데이터를 제공하는 역할을 합니다.

class EarthquakeViewModel {
  private let networkManager: NetworkManager // 네트워킹 매니저에 대한 의존성 주입

  init(networkManager: NetworkManager) {
    self.networkManager = networkManager
  }

  func fetchEarthquakeData() {
    networkManager.fetchData(from: APIEndpoints.earthquakeDataURL) { [weak self] data, error in
      guard let data = data else {
        // 에러 처리 로직
        return
      }
      // 데이터 처리 로직
    }
  }
}

결론

네트워킹을 구현할 때 Singleton, Delegate, MVVM과 같은 디자인 패턴을 적절히 활용하면 코드의 유지보수성을 높일 수 있고, 앱 전반에 걸쳐 일관된 네트워킹 솔루션을 적용할 수 있습니다.


참고 자료: