티스토리 뷰

iOS

[iOS] ObjectMapper 와 codable 차이

관(Gwan) 2020. 8. 8. 18:21

안녕하세요.

오늘은 iOS 개발에 가장 필수적인 parsing과 관련된 ObjectMapper와 codable에 대해 정리해 보려고 합니다.

 

일단 임의의 JSON String을 만들고 ObjectMapper와 codable을 이용해서 각 Model을 만든 후 parsing 해보겠습니다.

 

let jsonString = """
        {
            "msg": "success",
            "data": {
                "token": "skfkajopdjvosvjopcvjs",
                "name": "gwan",
                "age": 28
            }
        }
        """

ObjectMapper

임의로 JSON String을 생성했고,  json 형태를 보고 Mappable 프로토콜을 채택한 Model을 만들었습니다.

struct Profile: Mappable {
        var msg: String?
        var data: Person?
        
        init?(map: Map) {
            
        }
        
        mutating func mapping(map: Map) {
            msg     <- map["msg"]
            data     <- map["data"]
        }
    }
    
    struct Person: Mappable {
        var token: String?
        var name: String?
        var age: Int?
        
        init?(map: Map) {
            
        }
        
        mutating func mapping(map: Map) {
            token     <- map["token"]
            name     <- map["name"]
            age     <- map["age"]
        }
    }

Profile 구조체 안에 msg와 Person타입의 data 프로퍼티가 있고 Person타입에 json의 data부분에 있는 프로퍼티가 정의되어 있습니다.

이제 위에서 만든 jsonString을 가지고 매핑이 가능합니다.

let profile = Profile(JSONString: jsonString)
        guard let profileData = profile else { return }
        print(profileData.msg)		//Success
        print(profileData.data?.token)  //skfkajopdjvosvjopcvjs
        print(profileData.data?.name)	//gwan
        print(profileData.data?.age)	//28

 

 

Codable

cadable 프로토콜을 채택한 모델을 만들겠습니다.

struct Profile: Codable {
            var msg: String?
            var data: Person?
    
            struct Person: Codable {
                var token: String?
                var name: String?
                var age: Int?
            }
        }

ObjectMapper와 달리 키값을 설정하는 부분은 없습니다. 프로퍼티명이 json의 키값으로 쓰입니다.

모델의 프로퍼티 명이 json 프로퍼티명과 일치하면 따로 처리해줄 필요는 없으나 만약 다를 시에는 CodingKey 프로토콜을 사용하여야 합니다.

struct Person: Codable {
                var token: String?
                var name: String?
                var age: Int?
                
                enum CodingKeys : String, CodingKey{
                    case token
                    case name
                    case age = "birth"
                }
            }

위와 같은 형태로 CodingKey프로토콜을 채택한 Enum을 생성해 준 후 해당 모델의 프로퍼티명과 동일하게 case를 생성해 줍니다.

프로퍼티명이 json의 프로퍼티명과 일치할 경우 그냥 두면 되고 이름이 다를 경우에는 age처럼 대입 연산자로 해당 json의 프로퍼티명을 넣어주면 됩니다.

내부적으로 파싱 할 때 rawValue를 사용하기 때문에 case에 아무런 값도 할당하지 않을 시 case명이 키값이 되므로 따로 처리하지 않는 것 같고 키값이 다른 경우에만 값을 대입하는 것으로 보입니다.

 

이제 만든 모델에 파싱 해보겠습니다.

let decoder = JSONDecoder()
        let data = jsonString.data(using: .utf8)!
        if let profile = try? decoder.decode(Profile.self, from: data) {
            print(profile.msg)		//success
            print(profile.data?.token)	//skfkajopdjvosvjopcvjs
            print(profile.data?.name)	//gwan
            print(profile.data?.age)	//28
        }

 

ObjectMaaper와 codable을 활용해서 json parsing을 해봤는데

기능 자체는 비슷한 것 같고 사용 방식과 외부 라이브러리이냐 아니냐 정도의 차이만 있는 것 같습니다.

swift4 버전에서 codable이 생긴 후로 외부 라이브러리인 ObjectMaaper는 사용할 필요가 없어졌다는 얘기가 많은데

사용하기에도 codable이 훨씬 간편하고 기능 또한 비슷한 걸로 보여서 레거시 코드를 유지보수하는 게 아니라면 ObjectMaaper를 사용할 일은 많지 않을 것 같습니다.

 

댓글