[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과 같은 디자인 패턴을 적절히 활용하면 코드의 유지보수성을 높일 수 있고, 앱 전반에 걸쳐 일관된 네트워킹 솔루션을 적용할 수 있습니다.
참고 자료: