[swift] Moya와 ObjectMapper를 사용하여 JSON 응답 처리하는 코드 예제

이번 예제에서는 Swift에서 Moya와 ObjectMapper 라이브러리를 사용하여 JSON 응답을 처리하는 방법을 살펴보겠습니다. Moya는 네트워킹을 추상화한 라이브러리이며, ObjectMapper는 JSON 데이터를 모델 객체로 매핑해주는 라이브러리입니다.

Moya와 ObjectMapper 설치

먼저, 프로젝트에 Moya와 ObjectMapper를 추가해야 합니다. Cocoapods를 사용한다면, Podfile에 다음과 같이 라이브러리를 추가합니다:

pod 'Moya'
pod 'ObjectMapper'

설치 후, 프로젝트를 업데이트 해줍니다:

$ pod install

모델 클래스 생성

응답 JSON을 매핑할 모델 클래스를 생성합니다. 예를 들어, 사용자 정보를 담을 User 모델 클래스를 생성합니다:

import ObjectMapper

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

    required init?(map: Map) {}

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

Moya 프로바이더 설정

Moya를 사용하여 네트워킹을 하기 위해, Moya의 MoyaProvider 클래스를 사용합니다. 예를 들어, 사용자 정보를 가져오기 위한 API를 설정합니다:

import Moya

let provider = MoyaProvider<API>()

enum API {
    case getUser(userID: Int)
}

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

    var path: String {
        switch self {
        case .getUser(let userID):
            return "/users/\(userID)"
        }
    }

    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"]
    }
}

JSON 응답 처리

이제 Moya를 사용하여 네트워크 요청을 보내고, ObjectMapper를 사용하여 JSON 응답을 모델 객체로 변환하는 코드를 작성해보겠습니다. API 요청을 보내고 응답을 처리하는 함수를 만들어보겠습니다:

func getUser(userID: Int, completion: @escaping (User?, Error?) -> Void) {
    provider.request(.getUser(userID: userID)) { result in
        switch result {
        case let .success(response):
            do {
                let json = try response.mapJSON()
                if let user = Mapper<User>().map(JSONObject: json) {
                    completion(user, nil)
                } else {
                    completion(nil, nil)
                }
            } catch {
                completion(nil, error)
            }
        case let .failure(error):
            completion(nil, error)
        }
    }
}

위 함수는 getUser API를 호출하여 사용자 정보를 가져오는 예제입니다. 네트워크 요청이 성공하면, 응답 JSON을 Mapper를 사용하여 User 모델 객체로 변환한 후 콜백으로 전달합니다. 네트워크 요청이 실패하면, 에러를 콜백으로 전달합니다.

사용 예제

이제 작성한 함수를 사용하여 사용자 정보를 가져오는 예제를 살펴보겠습니다:

getUser(userID: 1) { user, error in
    if let user = user {
        print("User ID: \(user.id ?? 0)")
        print("User Name: \(user.name ?? "")")
        print("User Email: \(user.email ?? "")")
    } else if let error = error {
        print("Failed to get user info: \(error.localizedDescription)")
    }
}

위 예제는 ID가 1인 사용자의 정보를 가져오는 함수를 호출하고, 콜백에서 사용자 정보를 출력하는 예제입니다.

결론

이 예제에서는 Moya와 ObjectMapper를 사용하여 Swift에서 JSON 응답을 처리하는 방법을 살펴보았습니다. Moya의 네트워킹 기능과 ObjectMapper의 JSON 매핑 기능을 함께 사용하여 효율적으로 JSON 데이터를 모델 객체로 변환할 수 있습니다. 이를 활용하여 개발할 때 유연하게 JSON 응답을 처리할 수 있습니다.

참고 자료