import Foundation
import RxMoya
import Moya
import RxSwift
protocol WeatherRepositoryProtocol {
func fetchWeather(lat: Double, lon: Double) -> Single<WeatherResponse>
}
final class WeatherRepository: WeatherRepositoryProtocol {
private let provider = MoyaProvider<WeatherAPI>()
func fetchWeather(lat: Double, lon: Double) -> Single<WeatherResponse> {
return provider.rx.request(.oneCall(lat: lat, lon: lon))
.map(WeatherResponse.self)
}
}
팀원분이 짠 fetchWeather 코드를 분석해봤다.
우선WeatherRepositoryProtocol
을 사용한 이유는 의존성 분리, 테스트 용이성, 코드의 유연성을 확보하기 위해서인 것 같다.
private let provider = MoyaProvider<WeatherAPI>()
Moya 라이브러리의 MoyaProvider
를 생성하는 부분인데, MoyaProvider
는 네트워크 요청을 처리하는 핵심 클래스라고 볼 수있다.
그렇게 TargetType
프로토콜을 준수하는 타입인WeatherAPI
에 따라 요청을 보내게 되고,
MoyaProvider<WeatherAPI>()
는 WeatherAPI
라는 enum이나 struct에 정의된 네트워크 요청 정보를 기반으로 HTTP 요청을 생성하고 이걸 실행하는 역할을 한다고 한다.
아 그리고 MoyaProvider
는 요청을 전송하고 응답을 받는 과정에서 필요한 세부 사항 (URL 구성, 헤더 추가, HTTP 메서드 설정)을 관리하는 것이다.
RxSwift와 함께 사용하면 rx
확장을 통해 비동기 작업을 더 간결하게 처리할 수 있게 되는데 기본적으로 provider.rx.request
코드를 사용해 요청을 보내면 Single
타입의 결과를 반환한다고 한다.
provider.rx.request(.oneCall(lat: lat, lon: lon))
정리하자면 private let provider = MoyaProvider<WeatherAPI>()
는 WeatherAPI
에 정의된 요청을 실행하기 위해서 MoyaProvider
객체를 생성하는 코드인 것이고
이걸 통해서 WeatherAPI
의 엔드포인트에 대해 네트워크 요청을 간단히 보낼 수 있게 된다는걸 기억하자.
.map(WeatherResponse.self)
받아오는 응답 데이터를 WeatherResponse
모델로 변환해주는 코드인데 서버로부터 JSON 데이터를 응답받은 뒤 JSON 데이터를 WeatherResponse
타입으로 디코딩을 하고
그렇게 디코딩된 WeatherResponse
객체를 반환하는 코드이다.
예시로 서버가 아래와 같은 JSON을 응답한다고 가정해보자면
{
"temperature": 25.4,
"condition": "Sunny"
}
WeatherResponse
모델이 아래와 같이 정의되어 있으면된다.
struct WeatherResponse: Codable {
let temperature: Double
let condition: String
}
.map(WeatherResponse.self)
는 이 JSON 데이터를 WeatherResponse 객체로 변환한다.
.
.
.
아무튼 마지막 fetchWeather
코드는
func fetchWeather(lat: Double, lon: Double) -> Single<WeatherResponse> {
return provider.rx.request(.oneCall(lat: lat, lon: lon))
.map(WeatherResponse.self)
}
Moya와 RxSwift를 사용해서 비동기로 네트워크 요청을 처리해줬고 주어진 위도와 경도에 따라 날씨 데이터를 가져오게 된다.
그리고Single<WeatherResponse>
를 반환하는데 성공 시에 WeatherResponse
타입 데이터를 방출해주고 실패하면 에러를 방출한다.
데이터 매핑 과정에서 JSON 응답을 WeatherResponse로 변환해서 사용자가 쉽게 사용할 수 있도록 하는 것이다.
오늘 데이터 모델을 잘 이해할 수 있게 도와준 E.M.I.L.Y 님 ..
덕분에 WeatherRepository도 코드마다 해석해보고 공부해볼 수 있게 해줘서 감사링입니다.
나는야 데이터 모델러