[swift] Moya와 ObjectMapper를 활용한 API 통신 및 데이터 매핑 프로세스 예제

개요

이번 예제에서는 Swift 프로그래밍 언어를 사용하여 Moya와 ObjectMapper 라이브러리를 활용하여 API 통신과 데이터 매핑을 수행하는 프로세스를 알아보겠습니다.

Moya 소개

Moya는 네트워크 추상화 라이브러리로, Alamofire를 기반으로 작동합니다. Moya는 네트워크 요청과 응답을 캡슐화하고, API 요청을 타입 안전하게 정의하여 사용하기 쉽게 해줍니다.

설치

Moya를 사용하기 위해서는 CocoaPods를 사용하여 프로젝트에 라이브러리를 추가해야합니다. Podfile에 다음과 같이 Moya를 추가합니다.

pod 'Moya'

ObjectMapper 소개

ObjectMapper는 JSON 데이터를 모델 클래스로 매핑해주는 라이브러리입니다. ObjectMapper는 JSON 데이터의 키와 모델 클래스의 속성을 매핑하여 자동으로 데이터를 할당합니다.

설치

ObjectMapper도 CocoaPods를 사용하여 프로젝트에 라이브러리를 추가합니다. Podfile에 다음과 같이 ObjectMapper를 추가합니다.

pod 'ObjectMapper'

예제: 사용자 정보 가져오기

API 요청 모델 정의

먼저, Moya를 사용하여 API 요청 모델을 정의합니다. 예제에서는 사용자 정보를 가져오기 위한 API를 호출하며, 다음과 같은 구조로 모델을 정의합니다.

import Moya

enum UserAPI {
    case getUser(id: Int)
}

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)"
        }
    }
    
    var method: Moya.Method {
        switch self {
        case .getUser:
            return .get
        }
    }
    
    var sampleData: Data {
        return Data() // Sample data for testing or mocking purposes
    }
    
    var task: Task {
        return .requestPlain
    }
    
    var headers: [String : String]? {
        return ["Content-Type": "application/json"]
    }
}

위에서 정의한 UserAPITargetType을 준수하며, baseURL, path, method, task 및 headers 등의 속성을 정의합니다.

API 클라이언트 생성

다음으로, Moya를 사용하여 API 클라이언트를 생성합니다. 예제에서는 Alamofire를 사용하여 네트워크 요청을 수행하는 UserAPIClient 클래스를 작성합니다.

import Moya

class UserAPIClient {
    static let shared = UserAPIClient()
    
    private let provider = MoyaProvider<UserAPI>()
    
    func getUser(userID: Int, completion: @escaping (User?, Error?) -> Void) {
        provider.request(.getUser(id: userID)) { result in
            switch result {
            case .success(let response):
                do {
                    let user = try response.mapObject(User.self)
                    completion(user, nil)
                } catch {
                    completion(nil, error)
                }
            case .failure(let error):
                completion(nil, error)
            }
        }
    }
}

provider 속성은 MoyaProvider를 사용하여 API 요청을 처리하는 인스턴스입니다. getUser 메서드는 Moya를 사용하여 사용자 정보를 가져오는 API를 호출하고, ObjectMapper를 사용하여 JSON 데이터를 User 모델에 매핑합니다.

모델 클래스 정의

마지막으로, 사용자 정보를 담는 User 모델을 정의합니다. ObjectMapper를 사용하여 JSON 데이터를 User 모델에 매핑합니다.

import ObjectMapper

struct User: Mappable {
    var userID: Int?
    var username: String?
    var email: String?
    
    init?(map: Map) {}
    
    mutating func mapping(map: Map) {
        userID <- map["id"]
        username <- map["username"]
        email <- map["email"]
    }
}

User 모델은 Mappable 프로토콜을 준수하며, ObjectMapper의 mapping(map:) 메서드를 사용하여 JSON 데이터를 모델 속성에 매핑합니다.

사용법

이제 API 클라이언트를 사용하여 사용자 정보를 가져오는 예제 코드를 작성합니다.

UserAPIClient.shared.getUser(userID: 123) { user, error in
    if let user = user {
        print("userID: \(user.userID), username: \(user.username), email: \(user.email)")
    } else if let error = error {
        print("Error: \(error)")
    }
}

위의 예제 코드에서는 UserAPIClientgetUser 메서드를 사용하여 사용자 정보를 가져오고, 결과를 콘솔에 출력합니다.

결론

이번 예제에서는 Moya와 ObjectMapper를 활용하여 API 통신과 데이터 매핑을 수행하는 프로세스를 알아보았습니다. Moya를 사용하면 네트워크 통신을 더욱 간편하게 처리할 수 있고, ObjectMapper를 사용하면 JSON 데이터를 모델로 매핑하는 작업을 간소화할 수 있습니다.

참조: