[swift] Swift MVVM 아키텍처에서의 네트워킹 구현 방법

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에서의 사용으로 이루어집니다. 이를 통해 코드를 구조화하고 역할을 분리하여 읽기 쉽고 테스트 가능한 코드를 작성할 수 있습니다.