[swift] Moya와 ObjectMapper을 사용하여 API 요청 및 응답 데이터 매핑하기

Moya와 ObjectMapper은 Swift에서 API 요청과 응답 데이터를 편리하게 처리하기 위한 라이브러리입니다. Moya는 네트워킹 추상화 레이어이며, ObjectMapper는 JSON 데이터를 모델 객체로 매핑하기 위한 라이브러리입니다.

Moya와 ObjectMapper 설치하기

Moya와 ObjectMapper을 사용하기 위해서는 먼저 CocoaPods나 Carthage를 통해 라이브러리를 설치해야 합니다. Podfile에 다음 라인을 추가하고 pod install 명령을 실행합니다.

pod 'Moya'
pod 'ObjectMapper'

API 서비스 정의하기

먼저 API 서비스를 정의해야 합니다. Moya는 Target 타입을 사용하여 API 서비스를 정의합니다. 예를 들어, User 관련 API를 다루는 UserService를 정의하고 싶다면 다음과 같이 작성합니다.

import Moya

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

extension UserService: 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"
        case .updateUser(let id, _):
            return "/users/\(id)"
        }
    }
    
    var method: Moya.Method {
        switch self {
        case .getUser, .createUser:
            return .get
        case .updateUser:
            return .put
        }
    }
    
    var task: Task {
        switch self {
        case .getUser, .createUser:
            return .requestPlain
        case let .updateUser(_, name):
            return .requestParameters(parameters: ["name": name], encoding: JSONEncoding.default)
        }
    }
    
    var headers: [String: String]? {
        return ["Content-Type": "application/json"]
    }
}

MoyaProvider 생성하기

API 서비스를 사용하기 위해 MoyaProvider를 생성해야 합니다. MoyaProvider는 타깃 타입으로 생성됩니다. 다음은 UserService에 대한 MoyaProvider를 생성하는 예시입니다.

import Moya

let provider = MoyaProvider<UserService>()

API 요청 및 응답 데이터 매핑하기

MoyaProvider를 사용하여 API를 호출하고, ObjectMapper를 사용하여 응답 데이터를 모델 객체로 매핑할 수 있습니다. 다음은 getUser 메서드를 호출하고 응답 데이터를 User 모델 객체로 매핑하는 예시입니다.

provider.request(.getUser(id: 123)) { result in
    switch result {
    case let .success(response):
        do {
            let user = try response.mapObject(User.self)
            print(user.name)
        } catch {
            print("Mapping error: \(error)")
        }
    case let .failure(error):
        print("API error: \(error)")
    }
}

위 예시에서는 .mapObject() 메서드를 사용하여 응답 데이터를 User 모델 객체로 매핑하고 있습니다.

정리

Moya와 ObjectMapper을 사용하여 API 요청과 응답 데이터를 편리하게 처리하는 방법에 대해 알아보았습니다. Moya의 추상화 레이어를 통해 네트워킹을 간편하게 처리할 수 있으며, ObjectMapper를 사용하여 JSON 데이터를 모델 객체로 매핑할 수 있습니다. 이를 통해 Swift로 API 통신을 보다 효율적으로 처리할 수 있습니다.

참고자료