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

개요

Moya와 ObjectMapper는 Swift에서 JSON 응답을 처리하기 위해 자주 사용되는 라이브러리입니다. Moya는 네트워크 작업을 쉽게 관리하고 추상화할 수 있으며, ObjectMapper는 JSON 데이터를 Swift 모델 객체로 변환해줍니다. 이 두 라이브러리를 함께 사용하면 JSON 응답을 간단하게 모델 객체로 변환할 수 있습니다.

환경 설정

먼저, Moya와 ObjectMapper를 프로젝트에 추가해야 합니다. Cocoapods를 사용한다면, Podfile에 다음과 같은 의존성을 추가하고 pod install 명령을 실행하세요.

pod 'Moya'
pod 'ObjectMapper'

모델 객체 정의

JSON 응답을 모델 객체로 변환하기 위해, 변환할 모델 객체를 먼저 정의해야 합니다. 예를 들어, 다음과 같은 User 모델 객체를 정의해보겠습니다.

import Foundation
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 프로토콜을 준수하도록 정의되었습니다. Mappable 프로토콜은 ObjectMapper 라이브러리에서 제공하는 프로토콜로, JSON 데이터를 모델 객체로 변환하기 위해 필요한 메소드와 프로퍼티를 정의합니다. init?(map: Map) 메소드는 생성자로서, ObjectMapper가 JSON 데이터를 모델 객체로 변환할 때 호출됩니다. mapping(map: Map) 메소드는 JSON 데이터의 각 키-값 쌍을 모델 객체에 매핑하는 역할을 합니다.

Moya를 통한 네트워크 요청

이제 Moya를 사용하여 네트워크 요청을 보내고, 응답을 처리하는 코드를 작성해보겠습니다. 예시로는 GET /users 엔드포인트에 대한 요청을 보내고, 응답을 User 모델 객체로 변환해보겠습니다.

import Moya
import ObjectMapper
import RxSwift

let provider = MoyaProvider<YourAPI>()

provider.rx.request(.getUserList)
    .mapJSON()
    .map { response -> [User]? in
        if let json = response as? [[String: Any]],
           let users = Mapper<User>().mapArray(JSONArray: json) {
            return users
        } else {
            return nil
        }
    }
    .subscribe(onSuccess: { users in
        if let users = users {
            // User 객체를 사용하여 데이터 처리
            for user in users {
                print(user.name ?? "")
            }
        } else {
            print("데이터 변환 실패")
        }
    }, onError: { error in
        print("네트워크 요청 실패: \(error.localizedDescription)")
    })
    .disposed(by: disposeBag)

위 코드에서 YourAPI는 프로젝트에 맞게 정의된 API 열거형입니다. MoyaProvider를 생성하고 .rx.request 메소드를 사용하여 네트워크 요청을 보냅니다. 응답은 mapJSON() 메소드를 통해 JSON으로 변환되고, map 메소드를 사용하여 변환된 JSON을 User 모델 객체의 배열로 변환합니다. 변환에 실패한 경우 nil을 반환합니다.

모델 객체 배열을 받은 경우, 원하는 방식으로 데이터를 처리할 수 있습니다. 위 코드에서는 User 객체의 name 프로퍼티를 출력하는 예시를 보여주었습니다.

결론

Moya와 ObjectMapper를 함께 사용하여 JSON 응답을 모델 객체로 변환하는 방법을 예시 코드를 통해 설명하였습니다. 이를 참고하여 프로젝트에서 유용하게 활용해보세요.