MVVM 아키텍처는 애플리케이션의 구조와 코드를 분리하여 유지보수성과 테스트 용이성을 개선하는데 도움이 되는 디자인 패턴입니다. 네트워킹은 대부분의 애플리케이션에서 중요한 요소이며, MVVM 아키텍처에서도 잘 구현되어야 합니다. 이 글에서는 Swift를 사용한 MVVM 아키텍처에서의 네트워킹 구현 방법을 알아보겠습니다.
1. 네트워킹 관련 모델 생성
네트워킹 관련 기능을 추상화하는 모델을 생성합니다. 이 모델은 네트워크 요청을 만들고 해당 요청을 보낼 수 있는 함수를 가지고 있어야 합니다. 예를 들어, NetworkManager
라는 클래스를 만들고 fetchData
라는 함수를 추가할 수 있습니다.
import Foundation
class NetworkManager {
func fetchData(completion: @escaping (Result<Data, Error>) -> Void) {
// 네트워크 요청을 생성하고 보낼 코드 작성
// 성공적으로 데이터를 받아왔을 때 completion 핸들러를 호출하여 데이터를 전달
// 에러가 발생했을 때도 completion 핸들러를 호출하여 에러를 전달
}
}
2. 네트워킹 서비스 생성
MVVM 아키텍처에서는 네트워킹 관련 기능을 제공하는 서비스 클래스를 생성합니다. 이 서비스 클래스는 실제로 네트워킹 모델을 사용하여 데이터를 가져오고, 가져온 데이터를 ViewModel에 전달해야 합니다.
import Foundation
class NetworkService {
private let networkManager: NetworkManager
init(networkManager: NetworkManager) {
self.networkManager = networkManager
}
func fetchData(completion: @escaping (Result<Data, Error>) -> Void) {
networkManager.fetchData { result in
DispatchQueue.main.async {
completion(result)
}
}
}
}
3. ViewModel에서 네트워킹 서비스 사용
ViewModel은 데이터를 가져와 사용자 인터페이스에 표시하는 역할을 합니다. 네트워킹 서비스를 사용하여 데이터를 가져오고, 결과를 처리하기 위한 콜백 클로저를 전달해야 합니다.
import Foundation
class ViewModel {
private let networkService: NetworkService
init(networkService: NetworkService) {
self.networkService = networkService
}
func fetchData() {
networkService.fetchData { result in
switch result {
case .success(let data):
// 데이터 사용
case .failure(let error):
// 에러 처리
}
}
}
}
4. 네트워킹 구현 전략 선택
네트워킹을 구현할 때는 URLSession을 사용하는 것이 일반적인 방법입니다. URLSession은 높은 수준의 API와 저수준의 API를 모두 제공하여 여러 가지 상황에 유연하게 대응할 수 있습니다. URLRequest를 생성하고 URLSession을 사용하여 데이터를 가져오는 방법은 다음과 같습니다.
import Foundation
class NetworkManager {
func fetchData(completion: @escaping (Result<Data, Error>) -> Void) {
guard let url = URL(string: "https://api.example.com/data") else {
completion(.failure(NetworkError.invalidURL))
return
}
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if let error = error {
completion(.failure(error))
return
}
guard let data = data else {
completion(.failure(NetworkError.noData))
return
}
completion(.success(data))
}
task.resume()
}
}
enum NetworkError: Error {
case invalidURL
case noData
}
마무리
Swift MVVM 아키텍처에서의 네트워킹 구현은 네트워크 관련 모델, 네트워킹 서비스 및 ViewModel에서의 사용으로 이루어집니다. 이를 통해 코드를 구조화하고 역할을 분리하여 읽기 쉽고 테스트 가능한 코드를 작성할 수 있습니다.