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

Moya와 ObjectMapper는 iOS 앱에서 네트워크 요청을 처리하고 JSON 응답을 모델 객체로 변환하는 데 편리한 도구입니다. 이 예제에서는 Swift 언어를 사용하여 Moya와 ObjectMapper를 활용한 JSON 응답 변환을 보여드리겠습니다.

1. Moya 설정하기

먼저, Moya를 설치하고 설정하는 작업부터 시작합니다.

import Moya

// 1. API를 정의하는 enum 생성
enum MyAPI {
    case getUser(userID: Int)
}

// 2. TargetType 프로토콜을 준수하는 extension 생성
extension MyAPI: TargetType {
    var baseURL: URL {
        return URL(string: "https://api.example.com")!
    }
    
    var path: String {
        switch self {
        case .getUser(let userID):
            return "/user/\(userID)"
        }
    }
    
    var method: Moya.Method {
        return .get
    }
    
    var sampleData: Data {
        return Data()
    }
    
    var task: Task {
        return .requestPlain
    }
    
    var headers: [String: String]? {
        return nil
    }
}

위 코드에서 MyAPI enum은 사용할 API 엔드포인트를 정의합니다. getUser 케이스는 특정 사용자 정보를 가져오기 위한 API를 정의하는 예시입니다.

2. ObjectMapper를 활용한 모델 객체 생성하기

받은 JSON 응답을 모델 객체로 변환하기 위해 ObjectMapper를 사용합니다.

import ObjectMapper

struct User: Mappable {
    var id: Int?
    var name: String?
    var email: String?
    var age: Int?
    
    init?(map: Map) {}
    
    mutating func mapping(map: Map) {
        id <- map["id"]
        name <- map["name"]
        email <- map["email"]
        age <- map["age"]
    }
}

// JSON 응답을 모델 객체로 변환하는 함수
func convertToUserObject(from response: Response) -> User? {
    guard let json = try? JSONSerialization.jsonObject(with: response.data, options: []),
          let dict = json as? [String: Any]
    else {
        return nil
    }
    
    return Mapper<User>().map(JSON: dict)
}

위 코드에서 User 구조체는 User 모델을 나타냅니다. Mappable 프로토콜을 준수하는 구조체로, ObjectMapper를 사용하여 JSON 데이터를 모델 객체로 매핑합니다. mapping 함수에서 JSON 키와 모델 객체의 프로퍼티를 매핑합니다.

3. Moya와 ObjectMapper를 결합하여 사용하기

마지막으로, Moya와 ObjectMapper를 결합하여 네트워크 요청을 보내고 응답을 모델 객체로 변환하는 작업을 수행합니다.

import Moya

// 사용자 정보 가져오기 API 요청
MoyaProvider<MyAPI>().request(.getUser(userID: 123)) { result in
    switch result {
    case .success(let response):
        if let user = convertToUserObject(from: response) {
            // 변환된 모델 객체를 활용하여 필요한 작업 수행
            print(user.name)
            print(user.email)
            print(user.age)
        }
    case .failure(let error):
        print(error.localizedDescription)
    }
}

위 코드에서 MoyaProvider<MyAPI>().request 메서드를 사용하여 API 요청을 보내고, 이후 convertToUserObject 함수를 통해 응답을 모델 객체로 변환합니다. 변환된 모델 객체를 활용하여 예제에서는 이름, 이메일, 나이를 출력하는 작업을 수행합니다.

참고 자료