[swift] Moya와 ObjectMapper를 사용하여 JSON 데이터를 모델로 변환하는 방법 및 예제 구현 설명

이번 포스트에서는 Moya와 ObjectMapper를 사용하여 JSON 데이터를 모델로 변환하는 방법에 대해 알아보겠습니다. Moya는 네트워크 요청을 추상화하기 위한 라이브러리이며, ObjectMapper는 JSON 데이터를 Swift 객체로 매핑하기 위한 라이브러리입니다.

Moya와 ObjectMapper 설치

Moya와 ObjectMapper를 설치하기 위해 먼저 Cocoapods를 사용해야 합니다. Podfile에 다음과 같이 추가해주세요.

pod 'Moya'
pod 'ObjectMapper'

그리고 pod install을 실행하여 의존성을 설치해주세요.

모델 클래스 생성

먼저 JSON 데이터를 매핑할 모델 클래스를 생성해야 합니다. 예를 들어, 다음과 같은 JSON 데이터를 모델로 변환해보겠습니다.

{
    "name": "John",
    "age": 30,
    "email": "john@example.com"
}

데이터를 매핑할 User 모델 클래스를 다음과 같이 생성합니다.

import Foundation
import ObjectMapper

class User: Mappable {
    var name: String?
    var age: Int?
    var email: String?

    required init?(map: Map) {}

    func mapping(map: Map) {
        name <- map["name"]
        age <- map["age"]
        email <- map["email"]
    }
}

위 코드에서 User 클래스는 Mappable 프로토콜을 채택하고, ObjectMapper의 mapping(map:) 메서드를 구현하여 데이터를 매핑하도록 합니다.

Moya를 사용하여 JSON 데이터 가져오기

이제 Moya를 사용하여 JSON 데이터를 가져와서 모델로 변환해보겠습니다. 먼저 API 서비스를 정의하는 UserService를 생성합니다.

import Moya

enum UserService {
    case getUser(id: Int)
}

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)"
        }
    }
    
    var method: Moya.Method {
        return .get
    }
    
    var sampleData: Data {
        return Data()
    }
    
    var task: Task {
        return .requestPlain
    }
    
    var headers: [String : String]? {
        return ["Content-Type": "application/json"]
    }
}

위 코드에서 userService.getUser(id:) 메서드를 호출하면 /users/{id} 경로로 GET 요청이 전송됩니다.

JSON 데이터 매핑하기

이제 Moya를 사용하여 API 요청을 보내고, ObjectMapper를 사용하여 JSON 데이터를 User 모델로 매핑해보겠습니다.

import Moya
import ObjectMapper

let provider = MoyaProvider<UserService>()

provider.request(.getUser(id: 123)) { result in
    switch result {
    case .success(let response):
        do {
            let data = try response.mapJSON()
            if let userJSON = data as? [String: Any] {
                if let user = Mapper<User>().map(JSON: userJSON) {
                    // User 모델로 변환된 데이터 사용
                    print(user.name)
                    print(user.age)
                    print(user.email)
                }
            }
        } catch {
            print("Failed to map JSON: \(error)")
        }
    case .failure(let error):
        print("Network request failed: \(error)")
    }
}

위 코드에서 provider.request(.getUser(id: 123))로 API 요청을 보내고, response.mapJSON()으로 JSON 데이터를 받아옵니다. 이후에 ObjectMapper의 map(JSON:)을 사용하여 JSON 데이터를 User 모델로 매핑합니다. 매핑에 성공한 경우, 변환된 User 모델을 사용할 수 있습니다.

결론

이번 포스트에서는 Moya와 ObjectMapper를 사용하여 JSON 데이터를 모델로 변환하는 방법을 알아보았습니다. Moya를 통해 네트워크 요청을 처리하고, ObjectMapper를 사용하여 JSON 데이터를 Swift 객체로 매핑하는 과정을 진행했습니다. 이러한 방법을 사용하여 효율적으로 JSON 데이터를 모델로 변환할 수 있습니다.

참고: Moya, ObjectMapper