이번 노트에서는 swift Codable의 CodingKey
에 대해 적어보려한다.
회사에서 프로젝트를 하던 중 API response로 내려오는 데이터를 가공해야할 때가 많다.
그런데 우리 회사의 API response JSON의 key는 Snake Case
의 형태를 사용한다.
swift프로그래밍에서 Snake Case로 변수명이 사용가능 하긴하지만 보통의 경우엔 Camel Case
를 사용하고, 프로그래머의 지극히 주관적으로 선호하는 변수명 형태와 변수명을 줄여써서 협업에 혼란을 야기 또, 공공 API등 이상한(?) 변수명 등을 CodingKey
를 사용해 재정의
해 사용할 수 있다.
우선 codingKey에 대해 알아보기 전에 Codable
프로토콜에 대해 알아보자.
apple developer에는 다음과 같이 정의하고 있다.
Codable은 외부 표현으로 변환(Encoding)하거나 외부 표현으로 부터 변환(Decoding)할 수 있는 타입으로 Encodable & Decodable로 구성된 유니온 타입(union type)으로 정의된다.
그렇다면 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"
}
}
이렇게하면 내가 원하는 변수명으로 사용할 수 있다.