[swift] Swift에서 ObjectMapper를 사용하여 객체의 속성을 퍼센트 인코딩하는 방법

JSON 데이터를 Swift 객체로 매핑할 때, ObjectMapper는 많은 편리한 기능을 제공합니다. 하나의 기능은 URL에서 퍼센트 인코딩된 문자열을 Swift 객체의 속성으로 자동으로 매핑하는 것입니다. 이 글에서는 ObjectMapper를 사용하여 퍼센트 인코딩된 문자열을 객체의 속성으로 매핑하는 예제를 살펴보겠습니다.

ObjectMapper 설치

먼저 ObjectMapper가 프로젝트에 설치되어 있어야 합니다. CocoaPods를 사용하는 경우, Podfile에 ObjectMapper를 추가하고 pod install 명령을 실행합니다.

pod 'ObjectMapper'

URLPercentEncodingTransform 구현

URL로 전달되는 문자열은 퍼센트 인코딩되어야 합니다. ObjectMapper에서는 TransformType 프로토콜을 구현하여 퍼센트 인코딩된 문자열을 처리할 수 있습니다. 아래와 같이 URLPercentEncodingTransform 구조체를 구현합니다.

import ObjectMapper

struct URLPercentEncodingTransform: TransformType {
    typealias Object = String
    typealias JSON = String
    
    init() {}
    
    func transformFromJSON(_ value: Any?) -> Object? {
        if let stringValue = value as? String {
            return stringValue.removingPercentEncoding
        }
        return nil
    }
    
    func transformToJSON(_ value: Object?) -> JSON? {
        if let stringValue = value {
            return stringValue.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
        }
        return nil
    }
}

위의 구조체에서는 TransformType 프로토콜을 구현하고, transformFromJSON(_:) 메소드를 사용하여 JSON에서 객체로의 변환을 처리하고, transformToJSON(_:) 메소드를 사용하여 객체에서 JSON으로의 변환을 처리합니다. URLPercentEncodingTransformString을 JSON으로 매핑하기 전에 퍼센트 인코딩을 적용하고, JSON에서 String으로 매핑된 데이터를 퍼센트 디코딩합니다.

객체에 URLPercentEncodingTransform 적용

이제 URLPercentEncodingTransform을 사용하여 객체에 퍼센트 인코딩된 문자열을 매핑해 보겠습니다. 예를 들어, 다음과 같은 JSON이 있다고 가정해 봅시다.

{
    "name": "사용자 이름",
    "url": "https://example.com/사용자/123"
}

Swift에서는 다음과 같은 구조체로 매핑할 수 있습니다.

import ObjectMapper

struct User: Mappable {
    var name: String?
    var url: String?
    
    init?(map: Map) {}
    
    mutating func mapping(map: Map) {
        name <- map["name"]
        url <- (map["url"], URLPercentEncodingTransform())
    }
}

위의 코드에서는 User라는 구조체를 정의하고, Mappable 프로토콜을 구현합니다. mapping(map:) 메소드에서 name 속성은 특별히 처리할 필요가 없기 때문에 단순히 map["name"]으로 매핑됩니다. 그러나 url 속성은 URLPercentEncodingTransform을 사용하여 퍼센트 인코딩된 문자열을 매핑합니다.

ObjectMapper를 사용하여 JSON 데이터 매핑

이제 ObjectMapper를 사용하여 JSON 데이터를 객체로 매핑해 보겠습니다.

import ObjectMapper

let jsonString = """
{
    "name": "홍길동",
    "url": "https://example.com/사용자/123"
}
"""

if let user = Mapper<User>().map(JSONString: jsonString) {
    // 매핑된 객체 사용
    print(user.name)
    print(user.url)
}

위의 코드에서는 JSON 문자열을 User 객체로 매핑하기 위해 Mapper 클래스의 map(JSONString:) 메소드를 사용합니다. 매핑된 객체를 확인한 후, 필요한 처리를 수행할 수 있습니다.

이제 Swift에서 ObjectMapper를 사용하여 객체의 속성을 퍼센트 인코딩하는 방법을 알게 되었습니다. ObjectMapper의 다양한 기능을 활용하여 JSON 데이터를 쉽게 Swift 객체로 매핑할 수 있습니다.

참고 자료