[swift] Swift Moya에서 여러 개의 엔드포인트 사용하기

소개

Moya는 Swift에서 네트워크 요청을 간편하게 처리할 수 있게 해주는 라이브러리입니다. 보통 API 서비스에서는 여러 개의 엔드포인트를 가지고 있을 수 있는데, 이러한 다양한 엔드포인트를 Moya에서 어떻게 처리할 수 있는지 알아보겠습니다.

설치

Moya를 사용하기 위해 먼저 Cocoapods를 통해 프로젝트에 Moya를 설치해야 합니다. Podfile에 다음과 같이 추가해주세요:

pod 'Moya'

그리고 터미널에서 다음 명령어를 입력하여 Cocoapods를 설치합니다:

$ pod install

다중 엔드포인트 설정하기

Moya에서 여러 개의 엔드포인트를 사용하기 위해서는 EndpointClosure를 사용해야 합니다. EndpointClosure는 요청을 보내기 전에 엔드포인트를 결정하는 클로저입니다.

let provider = MoyaProvider<MyAPI>(endpointClosure: { (target: MyAPI) -> Endpoint in
    let url = target.baseURL.appendingPathComponent(target.path).absoluteString
    return Endpoint(url: url,
                    sampleResponseClosure: { .networkResponse(200, target.sampleData) },
                    method: target.method,
                    task: target.task,
                    httpHeaderFields: target.headers)
})

위의 예제에서 MyAPITargetType 프로토콜을 구현한 열거형으로, 다양한 엔드포인트를 포함하고 있습니다. EndpointClosure 클로저에서는 target을 통해 현재 요청의 정보를 얻을 수 있으며, 이를 기반으로 엔드포인트를 생성하고 반환합니다.

다양한 엔드포인트 사용하기

다양한 엔드포인트를 사용하기 위해서는 MyAPI와 같이 TargetType 프로토콜을 구현한 타겟들을 정의해야 합니다. 각각의 타겟은 요청 URL, HTTP 메소드, 파라미터 등을 정의해야 합니다. 예를 들어, 다음과 같이 UserAPIPostAPI를 정의할 수 있습니다:

enum UserAPI {
    case getUser(id: Int)
    case createUser(name: String, email: String)
}

enum PostAPI {
    case getPosts
    case createPost(title: String, body: String)
}

extension UserAPI: TargetType {
    var baseURL: URL {
        return URL(string: "https://api.example.com")!
    }

    var path: String {
        switch self {
        case .getUser(let id):
            return "/users/\(id)"
        case .createUser(_, _):
            return "/users"
        }
    }

    // ...
}

extension PostAPI: TargetType {
    var baseURL: URL {
        return URL(string: "https://api.example.com")!
    }

    var path: String {
        switch self {
        case .getPosts:
            return "/posts"
        case .createPost(_, _):
            return "/posts"
        }
    }

    // ...
}

위의 예제에서는 UserAPIPostAPI에서 각각의 요청에 대한 URL을 정의하고 있습니다. TargetType을 구현하여 필요한 정보들을 반환할 수 있습니다.

요청 보내기

이제 Moya를 사용하여 요청을 보낼 수 있습니다. 예를 들어, 다음과 같이 UserAPIgetUser 요청을 보내는 코드를 작성할 수 있습니다:

provider.request(.getUser(id: 123)) { result in
    switch result {
    case .success(let response):
        // 성공적으로 요청을 받았을 때 처리할 로직
    case .failure(let error):
        // 요청 실패시 처리할 로직
    }
}

위의 코드에서 provider.requestUserAPI.getUser를 전달하여 요청을 보내고, 결과를 처리하는 클로저를 작성합니다. 성공 또는 실패에 따라 적절한 로직을 수행할 수 있습니다.

결론

Moya를 사용하면 Swift에서 다양한 엔드포인트를 쉽게 처리할 수 있습니다. EndpointClosure를 사용하여 요청을 보내기 전에 엔드포인트를 결정하고, TargetType을 구현하여 각각의 엔드포인트에 대한 정보를 제공할 수 있습니다. 이를 통해 더욱 관리하기 쉽고 확장성 있는 네트워킹 코드를 작성할 수 있습니다.

참고 자료