아요 개발 일기

[iOS]JSON ObjectMapper vs. Codable (Decodable, Encodable) 본문

iOS

[iOS]JSON ObjectMapper vs. Codable (Decodable, Encodable)

소진이 2023. 1. 6. 17:34

안녕하세요~~

오늘은 Api 통신할때 아주아주정말정말 중요하고 필수적인 parsing과 관련하여 알아보겠습니다!!


 

우선 아래와 같은 JSON String이 있다고 가정하구 시작하겠습니당

let json_str = """     
 	{ 
		 "name":"sojin", 
 		 "age":20, 
		 "city":"New York" 
 	}
	"""

 

 

ObjectMapper

ObjectMapper는 JSON을 객체로(또는 그 반대로) 변환할 수 있는 프레임 워크입니다.

 

import ObjectMapper

class UserDTO: Mappable {
    
    var name : String?
    var age : Int?
    var city : String?

    required init?(map: Map) {
    }
    
    func mapping(map: Map) {
        name <- map["name"]
        age <- map["age"]
        city <- map["city"]
    }
    

}

 

 

 

Codable

 

Codable은 Encodable과 Decodable을 합쳐 놓은 것을 말 합니다.

Codable은 모델 작성이 간편하다는 장점이있는데, 

 

class UserDTO: Codable {
    var name : String?
    var age : Int?
    var city : String?
}

let decoder = JSONDecoder() 
	let data = jsonString.data(using: .utf8)! 
	if let profile = try? decoder.decode(Profile.self, from: data) { 
		print(profile.name)

 

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

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

또한 문자열로 이루어진 JSON데이터를 .utf8 형식으로 바꿔주고 JSONDecoder() 를 이용해서 디코딩을 해주어야 하는 번거로움이 있지만 모델 작성이 간편합니다.

 

먼저 Encodable과 Decodable에대해서 알아야겠죠?

 

Encodable -> data를 Encoder해서 프로토콜로 변환

Decodable -> data를 원하는 모델로 Decode 

 

json을 예로 들자면,

Encodable -> 모델을 json으로 인코드

Decodable -> json을 내가 원하는 모델로 디코드

 

 

 

 

ObjectMapper와 Codable의 차이점

 

ObjectMapper

 

  • 타사 프레임워크
  • 유형 변환을 지원
  • Codable보다 빠름. (또는 JSONEncoder/Decoder보다 더 정확하게)
  • 새 Swift 버전 릴리스에서는 ObjectMapper를 사용하여 업데이트를 약속하지 않음
  • 프로젝트에 추가 종속성을 추가해야함
  • BaseMappable 프로토콜에서 추가로 상속된 프로토콜
  • CocoaPods 또는 기타 종속성 관리자를 사용하여 절대 버전을 업데이트해야 함
  • JSON에 대한 키가 있는 모든 필드에 대한 매핑을 정의해야 함

 

Codable

 

  • Swift 네이티브 솔루션
  • 매핑 솔루션을 구축했기 때문에 ObjectMapper보다 느릴 수 있음. 코딩 키가 없으면 swift는 미러를 사용하여 클래스 속성을 읽은 다음 매핑
  • 유형 변환을 위한 외부 라이브러리가 필요
  • 구문 분석 및 매핑에 대한 타사 종속성을 제거함
  • 모델 객체 필드가 ​​JSON 키와 다른 경우 CodingKey 프로토콜을 사용하여 키를 열거형으로 정의해야함
  • Encodable 및 Decodeable의 두 가지 다른 프로토콜로 구성된 프로토콜
  • 필드가 JSON에서와 같은 키와 이름을 가진 경우 자동으로 인코딩 및 초기화 메소드를 생성하므로 더 적은 코드가 필요함
  • 기본 솔루션이므로 Foundation 프레임워크에서 새 업데이트를 사용할 수 있음