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

이번 포스트에서는 Moya와 ObjectMapper를 사용하여 JSON 데이터를 모델로 변환하는 방법에 대해 알아보겠습니다.

Moya는 네트워크 요청과 응답을 추상화하여 편리하게 작업할 수 있게 도와주는 라이브러리입니다. ObjectMapper는 JSON 데이터와 Swift 객체 간의 매핑을 쉽게 해주는 라이브러리입니다.

Moya 설치하기

Moya를 사용하기 위해서는 먼저 CocoaPods나 Swift Package Manager를 이용하여 Moya를 설치해야 합니다.

# CocoaPods
pod 'Moya'

# Swift Package Manager
dependencies: [
    .package(url: "https://github.com/Moya/Moya.git", from: "14.0.0")
]

ObjectMapper 설치하기

ObjectMapper도 마찬가지로 CocoaPods나 Swift Package Manager를 이용하여 설치할 수 있습니다.

# CocoaPods
pod 'ObjectMapper'

# Swift Package Manager
dependencies: [
    .package(url: "https://github.com/tristanhimmelman/ObjectMapper.git", from: "4.2.0")
]

모델 클래스 생성하기

먼저 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가 매핑 작업을 수행할 수 있도록 합니다.

Moya로 API 요청하기

Moya를 사용하여 API 요청을 보내고 응답을 처리하는 코드입니다. 예를 들어, 서버에서 유저 정보를 가져오는 API에 접근하고, 해당 정보를 User 모델로 변환하는 예제입니다.

import Moya
import ObjectMapper

class UserService {
    let provider = MoyaProvider<UserAPI>()

    func fetchUser(completion: @escaping (Result<User, Error>) -> Void) {
        provider.request(.getUser) { result in
            switch result {
            case .success(let response):
                do {
                    let user = try response.mapObject(User.self)
                    completion(.success(user))
                } catch {
                    completion(.failure(error))
                }
            case .failure(let error):
                completion(.failure(error))
            }
        }
    }
}

위 코드에서 MoyaProvider<UserAPI>는 실제 API 요청을 처리하는 인스턴스입니다. fetchUser 함수는 UserAPI.getUser 엔드포인트에 대한 요청을 보내고, 받은 응답을 User 모델로 매핑하여 완료 핸들러로 전달합니다.

코드 실행하기

위에서 작성한 코드들을 실행해보기 위해서는 먼저 서버에서 유저 정보를 가져오는 API가 필요합니다. 제공된 예제에서는 UserAPI 열거형에 해당 API 정보를 정의하였습니다. 필요한 경우 이에 맞게 수정하여 사용하시면 됩니다.

import Moya

enum UserAPI {
    case getUser
}

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

    var path: String {
        switch self {
        case .getUser:
            return "/user"
        }
    }

    var method: Moya.Method {
        return .get
    }

    var sampleData: Data {
        return Data()
    }

    var task: Task {
        return .requestPlain
    }

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

위 코드에서는 UserAPI 열거형이 TargetType 프로토콜을 채택하고 있습니다. 이를 통해 API의 기본 URL, 엔드포인트, 메서드, 샘플 데이터, 요청 태스크, 헤더 등을 정의할 수 있습니다.

이제 UserService 클래스의 fetchUser 함수를 호출하면 서버로부터 유저 정보를 가져올 수 있습니다.

let userService = UserService()
userService.fetchUser { result in
    switch result {
    case .success(let user):
        print("User ID: \(user.id)")
        print("User Name: \(user.name)")
        print("User Email: \(user.email)")
    case .failure(let error):
        print("Error: \(error)")
    }
}

위 코드에서는 fetchUser 함수의 결과에 따라 유저 정보를 출력하거나 에러 메시지를 출력합니다.

결론

Moya와 ObjectMapper를 사용하여 JSON 데이터를 모델로 변환하는 방법과 이를 실제로 구현하는 예제에 대해 알아보았습니다. Moya와 ObjectMapper는 네트워크 요청과 JSON 매핑 작업을 간편하게 처리해주기 때문에 개발자들에게 많은 편의를 제공할 수 있는 라이브러리입니다.