[swift] Moya와 ObjectMapper를 사용하여 API 호출 후 데이터 매핑하는 프로세스 이해하기 설명

Moya와 ObjectMapper는 Swift에서 API 호출 후 받은 데이터를 객체로 매핑하는 프로세스를 간소화하는 라이브러리입니다. Moya는 네트워킹에 사용되는 라이브러리이며, ObjectMapper는 JSON을 객체로 변환하고 객체를 JSON으로 변환하는 작업을 담당합니다.

Moya란?

Moya는 Alamofire를 기반으로 한 작은 추상화 레이어입니다. 네트워크 작업을 추상화하여 코드의 복잡성을 줄여줍니다. Moya를 사용하면 네트워크 작업을 쉽게 구성하고 유지보수할 수 있습니다.

Moya는 크게 세 가지 핵심 개념으로 구성됩니다.

  1. Target: Moya에서 API 엔드포인트의 정보를 담는 구조체입니다. 엔드포인트의 URL, HTTP 메소드, 파라미터 등을 정의합니다.

  2. Provider: Target을 사용하여 네트워크 요청을 수행하는 객체입니다. Provider에서는 Moya의 프로바이더를 설정하고, 요청을 보내고 응답을 받는 작업을 처리합니다.

  3. Response: Provider가 받은 응답을 나타내는 객체입니다. JSON 데이터, HTTP 상태 코드, 응답 헤더 등을 포함합니다.

ObjectMapper란?

ObjectMapper는 Swift에서 JSON 데이터를 객체로 변환하거나, 객체를 JSON으로 변환하는 작업을 담당합니다. ObjectMapper를 사용하면 JSON 데이터와 Swift 객체 간의 매핑 작업을 손쉽게 처리할 수 있습니다.

ObjectMapper를 사용하기 위해서는 매핑될 객체가 Mappable 프로토콜을 준수해야 합니다. 객체의 프로퍼티와 JSON의 키를 매핑하여 데이터를 변환합니다.

Moya와 ObjectMapper 사용하기

  1. Moya를 프로젝트에 추가하고, 프로젝트에서 사용할 Target을 정의합니다. Target에서는 API 엔드포인트 정보를 설정합니다.
import Moya

enum MyAPI {
    case getUsers
}

extension MyAPI: TargetType {
    var baseURL: URL {
        return URL(string: "https://api.example.com")!
    }
    
    var path: String {
        switch self {
        case .getUsers:
            return "/users"
        }
    }
    
    var method: Moya.Method {
        switch self {
        case .getUsers:
            return .get
        }
    }
    
    var task: Task {
        switch self {
        case .getUsers:
            return .requestPlain
        }
    }
    
    var headers: [String: String]? {
        return ["Content-Type": "application/json"]
    }
}
  1. Moya의 Provider를 설정하고, 요청을 보내고 응답을 받습니다.
import Moya
import ObjectMapper

let provider = MoyaProvider<MyAPI>()

provider.request(.getUsers) { result in
    switch result {
    case let .success(response):
        do {
            let json = try response.mapJSON()
            if let users = Mapper<User>().mapArray(JSONObject: json) {
                // 매핑된 사용자 객체 배열을 사용하여 작업을 수행합니다.
            }
        } catch {
            // 매핑 오류 처리
        }
    case let .failure(error):
        // 네트워크 오류 처리
    }
}
  1. ObjectMapper의 mapArray 함수를 사용하여 JSON 데이터를 객체 배열로 변환합니다.
import ObjectMapper

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

위의 코드에서 User 객체는 Mappable 프로토콜을 준수하며, mapping(map:) 함수에서 프로퍼티와 JSON 키를 매핑합니다. Mapper<User>().mapArray(JSONObject: json)을 사용하여 JSON 데이터를 객체 배열로 변환합니다.

이제 Moya와 ObjectMapper를 사용하여 API 호출 후 데이터를 매핑하는 프로세스를 이해하셨을 것입니다. 이를 통해 Swift 앱에서 간단하게 API 요청을 수행하고 데이터를 가공할 수 있습니다.

참고 자료