[swift] Moya와 ObjectMapper를 사용하여 JSON 응답을 모델로 변환하는 방법 및 코드 예제 설명

많은 애플리케이션에서는 네트워크 요청을 수행하고 받은 JSON 응답을 사용하기 위해 모델로 변환해야 합니다. 이를 위해 Swift에서는 Moya와 ObjectMapper 라이브러리를 사용할 수 있습니다. Moya는 네트워크 레이어 추상화 프레임워크이며, ObjectMapper는 JSON 형식의 데이터를 Swift 모델로 변환하는 데 사용됩니다.

Moya 및 ObjectMapper 설치

Moya 및 ObjectMapper를 사용하기 위해 먼저 이를 프로젝트에 설치해야 합니다. CocoaPods를 사용하는 경우 Podfile에 다음과 같이 Moya와 ObjectMapper를 추가합니다.

pod 'Moya'
pod 'ObjectMapper'

그런 다음 터미널에서 pod install 명령어를 실행하여 종속성을 설치합니다.

모델 클래스 생성

먼저 네트워크 응답을 저장할 모델 클래스를 생성해야 합니다. 예를 들어, 다음과 같은 JSON 응답을 받는다고 가정해보겠습니다.

{
  "name": "John Doe",
  "age": 25,
  "email": "johndoe@example.com"
}

해당 JSON 응답을 처리하기 위해 다음과 같은 Swift 모델 클래스를 만들 수 있습니다.

import Foundation
import ObjectMapper

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

User 클래스는 Mappable 프로토콜을 준수하고, ObjectMapper의 매핑 함수를 사용하여 JSON 데이터를 객체 속성에 할당합니다.

Moya 요청 설정

이제 Moya를 사용하여 네트워크 요청을 보내고 ObjectMapper를 사용하여 응답을 모델로 변환할 수 있습니다. 예를 들어, 다음과 같은 API가 있다고 가정해보겠습니다.

import Moya

enum UserService {
  case getUser
}

extension UserService: TargetType {
  var baseURL: URL {
    return URL(string: "https://api.example.com")!
  }
  
  var path: String {
    switch self {
      case .getUser:
        return "/user"
    }
  }
  
  var method: Moya.Method {
    switch self {
      case .getUser:
        return .get
    }
  }
  
  var sampleData: Data {
    // 테스트 목적의 샘플 데이터를 반환합니다.
    return Data()
  }
  
  var task: Task {
    return .requestPlain
  }
  
  var headers: [String: String]? {
    return nil
  }
}

let provider = MoyaProvider<UserService>()

provider.request(.getUser) { result in
  switch result {
    case let .success(response):
      do {
        let user = try response.mapObject(User.self) // ObjectMapper를 사용하여 응답을 User 모델로 변환
        print("이름: \(user.name ?? ""), 나이: \(user.age ?? 0), 이메일: \(user.email ?? "")")
      } catch {
        print("모델 변환 에러: \(error)")
      }
      
    case let .failure(error):
      print("요청 실패: \(error)")
  }
}

위 코드에서 MoyaProvider를 사용하여 UserServicegetUser 열거형 케이스에 해당하는 네트워크 요청을 만듭니다. 그런 다음 response.mapObject(User.self)를 호출하여 ObjectMapper를 사용하여 JSON 응답을 User 모델로 변환합니다.

결론

이제 Moya와 ObjectMapper를 사용하여 JSON 응답을 모델로 변환하는 방법을 알아보았습니다. Moya는 네트워크 요청을 추상화하고, ObjectMapper는 JSON 데이터를 모델로 변환하는 데 사용됩니다. 이를 통해 코드를 간결하게 유지하고 응답을 효과적으로 처리할 수 있습니다.

참고 자료