[swift] Swift Moya에서 동적 엔드포인트 사용하기

Moya는 Swift에서 네트워크 요청을 쉽게 처리할 수 있는 라이브러리입니다. Moya를 사용하면 엔드포인트 (API URL)를 정적으로 지정하여 네트워크 호출을 처리할 수 있습니다. 하지만 때로는 앱의 요구사항에 따라 동적으로 엔드포인트를 사용해야 할 때가 있습니다.

이번 포스트에서는 Swift Moya에서 동적 엔드포인트를 사용하는 방법을 살펴보겠습니다.

1. 동적 엔드포인트 정의하기

먼저, 동적으로 사용할 엔드포인트를 정의해야 합니다. 이를 위해서는 Endpoint 프로토콜을 준수하는 엔드포인트 클래스를 만들어야 합니다. 아래는 예시입니다.

import Moya

enum MyAPI {
    case dynamicEndpoint(url: URL)
}

extension MyAPI: TargetType {
    var baseURL: URL {
        switch self {
        case .dynamicEndpoint(let url):
            return url
        }
    }

    var path: String { return "" }
    var method: Moya.Method { return .get }
    var sampleData: Data { return Data() }
    var task: Task { return .requestPlain }
    var headers: [String: String]? { return nil }
}

위의 예시에서는 MyAPI라는 열거형을 정의하고, dynamicEndpoint(url: URL) 케이스를 추가로 만들었습니다. 이 케이스는 동적으로 URL을 지정하기 위해 URL 객체를 파라미터로 받습니다.

2. 동적 엔드포인트 사용하기

이제 동적 엔드포인트를 사용하여 네트워크 호출을 할 수 있습니다. 아래는 예시입니다.

import Moya

let url = URL(string: "https://example.com/api/v1")!
let provider = MoyaProvider<MyAPI>(endpointClosure: { (target: MyAPI) -> Endpoint in
    switch target {
    case .dynamicEndpoint(let url):
        return Endpoint(url: url, sampleResponseClosure: { .networkResponse(200, target.sampleData) }, method: target.method, task: target.task, httpHeaderFields: target.headers)
    }
})

provider.request(.dynamicEndpoint(url: url)) { (result) in
    switch result {
    case .success(let response):
        // 네트워크 호출 성공
        let data = response.data
        // ...
    case .failure(let error):
        // 네트워크 호출 실패
        // ...
    }
}

위의 예시에서는 MoyaProvider를 초기화할 때 endpointClosure 클로저를 사용해 동적 엔드포인트를 처리합니다. 클로저 내에서 TargetType을 확인하여 동적 엔드포인트에 해당하는 Endpoint를 생성하고 리턴합니다.

결론

위의 방법을 사용하면 Swift Moya에서 동적 엔드포인트를 쉽게 사용할 수 있습니다. Endpoint 프로토콜을 사용하여 엔드포인트를 동적으로 처리하는 방법을 익히고, 필요에 따라 자신의 앱에 적용해보세요!

참고 자료