Codable이란 무엇인가?

Zeto·2022년 4월 6일
0

Swift_Study

목록 보기
12/18

작업을 하다보면 여러모로 많은 데이터를 처리하게 되는데 로컬에서뿐만 아니라 서버를 통해 이러한 데이터를 주고받는 경우가 잦다.
보통 서버에서 데이터를 받아오면 json과 같은 파일의 형태가 많은데 해당 형식 그대로는 swift에서 사용할 수 없기에 적절한 데이터 형태로 변환하기 위해서는 Codable을 사용할 수 밖에 없다.

Encodalbe + Decodable

Codable은 swift4에서부터 등장한 존재로서 swift의 데이터 형태를 서버에서 요구하는 데이터 형태로 변환시켜주는 Encodable, 서버에서 받은 데이터를 swift에서 사용 가능한 데이터 형태로 변환해주는 Decodable, 이 두 프로토콜의 기능이 합쳐진 프로토콜이 바로 Codable이다.

struct Model: Codable{
	let userName: String
    let userId: String
    
    enum CodingKeys: String, CodingKey{
    	case userName
        case userId = "user_Id"
    }
}

Codable은 프로토콜이기에 Struct부터 Class, Enum 타입까지 모두 채택이 가능하며 별다른 요구사항 없이 그 즉시 해당 타입은 인코딩과 디코딩이 가능한 타입이 되는 것이다.

CodingKey와 DecodingContainer

위의 예시를 보면 nested enum 타입에 CodingKey라는 프로토콜이 채택된 것을 확인할 수 있다. JSON 파일을 예로 들자면 변수와 상수에 소문자 카멜케이스를 쓰는 swift와 다른 형식을 보이는 경우가 있다.
즉, 받아올 JSON 데이터에는 user_Id로 되어 있다면? 당연히 제대로 디코딩을 해줄 수가 없다. 그렇다고 JSON 파일의 Key 값의 이름을 전부 바꿔줄 수도 없고...
이럴 때, 제몫을 해주는 것이 바로 CodingKey다.

JSON의 Key는 항상 String 타입이므로 CodingKey를 채택한 Enum case의 rawValue에는 해당 Key와 동일한 이름을 넣어주면 된다. 그럼 디코딩 시에 적절하게 데이터를 할당받을 수 있다.

이와 함께 같이 어우러지는 개념으로는 DecodingContainer가 있는데 요녀석은 새로운 키 값을 통해 디코더에 저장된 데이터를 반환해준다.

let container = try decoder.container(keyedBy: CodingKeys.self)

즉, 이러한 컨테이너는 CodingKeys 케이스의 값을 새로운 키 값으로 받아오고 이에 알맞는 데이터를 찾아서 반환해주는 것이다.
보통은 해당 모델 내에서 init(from decoder: Decoder) throws 내에서 사용되며, JSON 파일에 관련 Key가 없을 경우에 대한 정의가 필요할 때 사용하고는 한다.

profile
중2병도 iOS가 하고싶어

0개의 댓글