[ swift ] WeatherRepositoryProtocol

sonny·2025년 1월 10일
0

TIL

목록 보기
98/133
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도 코드마다 해석해보고 공부해볼 수 있게 해줘서 감사링입니다.

나는야 데이터 모델러

profile
iOS 좋아. swift 좋아.

0개의 댓글

관련 채용 정보