[swift] Codable - CodingKey

모리스·2023년 11월 23일
0

swift

목록 보기
2/4
post-thumbnail

이번 노트에서는 swift Codable의 CodingKey에 대해 적어보려한다.
회사에서 프로젝트를 하던 중 API response로 내려오는 데이터를 가공해야할 때가 많다.
그런데 우리 회사의 API response JSON의 key는 Snake Case의 형태를 사용한다.
swift프로그래밍에서 Snake Case로 변수명이 사용가능 하긴하지만 보통의 경우엔 Camel Case를 사용하고, 프로그래머의 지극히 주관적으로 선호하는 변수명 형태와 변수명을 줄여써서 협업에 혼란을 야기 또, 공공 API등 이상한(?) 변수명 등을 CodingKey를 사용해 재정의해 사용할 수 있다.


Codable?

우선 codingKey에 대해 알아보기 전에 Codable프로토콜에 대해 알아보자.
apple developer에는 다음과 같이 정의하고 있다.
Codable은 외부 표현으로 변환(Encoding)하거나 외부 표현으로 부터 변환(Decoding)할 수 있는 타입으로 Encodable & Decodable로 구성된 유니온 타입(union type)으로 정의된다.


CodingKey?

그렇다면 codingkey는 어떻게 정의하고 있을까. 다시 apple developer를 보면.
CodingKey는 JSON등의 데이터를 encoding 및 decoding하기 위한 key로 사용할 수 있는 타입을 말한다.

그렇다면 어떻게 사용할까. 예시를 통해 사용법을 알아보자.
아래와 같은 JSON 데이터가 있다고 가정해보자.

{
  "user_name": "모리스",
  "addr": "서울특별시",
  "phone_num": 01099999999,
}

위의 JSON의 key형태를 보면 Snake Case, 줄임말 등이 보인다. 더 가관인 key name도 있다.

{
  "cheobangjeon": "처방전",
  "bockyongill": "복용일",
}

이것이 대한민국 공공API의 변수명이다....후... 물론 개발자라면 다들 알겠지만 변수명 짓는거 여간 귀찮고 어려운일이다. 그래도 한국어 표현법을 그대로 쓰다니.. 아무튼 저런 변수명도 CodingKey를 이용해 재정의해 사용할 수 있다.

우선 JSON 데이터를 Codable하기 위해 class구조체Model을 정의해보자.

class User: Codable {
	var userName: String?
    var address: String?
    var phoneNumber: String?
    
    var prescription: String?
    var takeDate: Double?
}

사용하길 원하는 변수명을 옵셔널 타입으로 정의해 준다. 프로퍼티명을 내가 마음대로 재정의한 것이니 당연히 옵셔널 타입으로 지정해야 한다. 그런 후 Model 내부에 CodingKey로 JSON 각각의 key를 내가 정의한 변수 명으로 사용하겠다고 설정해 준다.

class User: Codable {
	var userName: String?
    var address: String?
    var phoneNumber: String?
    
    var prescription: String?
    var takeDate: Double?
    
    enum CodingKeys: String, CodingKey {
    	case userName = "user_name
        case address = "addr"
        case phoneNumber = "phone_num"
        case prescription = "cheobangjeon"
        case takeDate = "bockyongill"
    }
}

이렇게하면 내가 원하는 변수명으로 사용할 수 있다.

profile
모바일 앱 개발 노트 :)

0개의 댓글