[swift] Moya와 ObjectMapper를 활용한 JSON 응답을 모델 객체로 변환하는 코드 구현

이번 포스트에서는 Swift에서 Moya와 ObjectMapper를 함께 사용하여 JSON 응답을 모델 객체로 변환하는 방법에 대해 알아보겠습니다. Moya는 네트워크 요청을 쉽게 구성하기 위한 라이브러리이며, ObjectMapper는 JSON과 모델 객체 간의 매핑을 쉽게 수행할 수 있는 라이브러리입니다.

필요한 패키지 설치

Moya와 ObjectMapper를 사용하기 위해 먼저 Cocoapods를 통해 패키지를 설치해야 합니다. Podfile에 다음과 같이 추가하고 pod install을 실행하세요.

pod 'Moya'
pod 'ObjectMapper'

모델 객체 생성

먼저, JSON 응답을 매핑할 모델 객체를 생성합니다. 예를 들어, ‘User’라는 모델 객체를 생성해 보겠습니다.

import ObjectMapper

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

    required init?(map: Map) {}

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

위 예제에서는 ObjectMapper 라이브러리의 Mappable 프로토콜을 구현하는 User 클래스를 정의했습니다. Mappable 프로토콜은 ObjectMapper에서 사용되며, required init?(map: Map)mapping(map: Map) 메서드를 구현해야 합니다. mapping(map: Map) 메서드에서는 JSON 키와 모델 객체의 프로퍼티를 매핑합니다.

네트워크 요청 생성

다음으로, Moya를 사용하여 네트워크 요청을 생성합니다. 예를 들어, ‘GET’ 방식의 /user API를 호출하여 JSON 응답을 받아오는 요청을 생성해 보겠습니다.

import Moya

enum UserService {
    case getUser
}

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

    var path: String {
        return "/user"
    }

    var method: Moya.Method {
        return .get
    }

    var task: Task {
        return .requestPlain
    }

    var headers: [String: String]? {
        return nil
    }
}

위 예제에서는 Moya를 이용해 UserService 열거형을 정의하고, TargetType 프로토콜을 구현했습니다. baseURL, path, method, task, headers 등의 프로퍼티를 설정하여 요청을 정의할 수 있습니다.

응답 매핑

마지막으로, Moya를 사용하여 네트워크 요청을 보내고 ObjectMapper를 사용하여 응답을 모델 객체로 매핑합니다.

import Moya
import ObjectMapper

let provider = MoyaProvider<UserService>()

provider.request(.getUser) { result in
    switch result {
    case .success(let response):
        do {
            let json = try response.mapJSON()
            if let user = Mapper<User>().map(JSONObject: json) {
                print("User name: \(user.name)") // 모델 객체의 프로퍼티에 접근하여 사용할 수 있습니다.
            }
        } catch {
            print("Mapping error: \(error)")
        }
    case .failure(let error):
        print("Network error: \(error)")
    }
}

위 예제에서는 MoyaProvider를 이용해 UserServicegetUser 요청을 보냅니다. 응답은 JSON 형태로 받아오며, ObjectMapper를 사용하여 JSON을 모델 객체로 매핑합니다. Mapper<User>().map(JSONObject: json)를 통해 JSON을 모델 객체로 변환할 수 있습니다.

이제 위의 예제 코드를 참고하여 Moya와 ObjectMapper를 활용하여 JSON 응답을 모델 객체로 변환하는 코드를 구현해보세요.

참고 자료