앱을 만들 때 서버와 통신을 해서 데이터를 주고 받는 경우가 많은데 특히 요즘에는 JSON 형식으로 된 데이터를 주고 받는 경우가 흔합니다.
애플 공식 문서에서 Codable은 “A type that can convert itself into and out of an external representation.” 자신을 변환하거나 외부 표현으로 변환하는 타입이라고 말하는데, 여기서 외부 표현이란 JSON 형식과 같은 데이터 포맷을 말하고, 변환이라는 것은 Encode하거나 Decode하는 것으로 이해하면 됩니다.
typealias Codable = Decodable & Encodable
Codable은 Decodable과 Encodable이라는 두 프로토콜을 합쳐놓은 형태이므로 class, struct, enum에 Codable 프로토콜을 채택해서 사용하면 됩니다.
예제 - Encode
회원가입을 할 때 email, id, nickname을 담아서 서버에 JSON 형태로 보내야한다고 가정해보겠습니다.
struct UserModel: Codable {
var email: String
var id: String
var nickname: String
}
UserModel이라는 구조체에 Codable 프로토콜을 채택하여 서버로 보낼 데이터들을 작성했습니다.
let join = UserModel(email: "test@gmail.com", id: "test", nickname: "test")
do {
let dataEncode = try? JSONEncoder().encode(join)
print(dataEncode)
// Optional(61 bytes)
// 변환된 Data형식을 그대로 출력했기 때문에 bytes 크기를 출력
if let dataString = String(data: dataEncode!, encoding: .utf8) {
print(dataString)
// {"email":"test@gmail.com","id":"test","nickname":"test"}
// 변환된 Data 형식을 String으로 형변환하여 출력
}
}
join 변수에는 UserModel의 값을 지정해서 담아주고, 이 데이터들을 JSON 형태로 Encode해줬습니다.
JSONEncoder().encode()에는 Encodable한 값을 넣어 JSON 형태로 Encode할 수 있습니다.
Codable을 채택한 UserModel은 Encodable 성격도 가지고 있기 때문에 join을 변환할 수 있습니다.
이렇게 변환한 값은 서버에 보낼 수 있고, 또한 서버에서는 이렇게 JSON 형태의 값을 보내주어 받게 되죠.
예제 - Decode
위의 코드에서 print한 dataEncode 변수 같은 byte의 크기나 String으로 형변환한 dataString 변수 같은 문자열은 우리가 사용하기에 많이 불편해서 데이터를 사용하기 편하도록 Decode하는 과정이 필요합니다.
위 Encode 예제에서 변환시킨 데이터를 서버에서 받아온 데이터라고 가정해봅시다.
let join = UserModel(email: "test@gmail.com", id: "test", nickname: "test")
var dataDecode: UserModel!
do {
// 서버에서 받아온 데이터 {"email":"test@gmail.com","id":"test","nickname":"test"}
let dataEncode = try JSONEncoder().encode(join)
dataDecode = try JSONDecoder().decode(UserModel.self, from: dataEncode)
}
print(dataDecode.email) // test@gmail.com
print(dataDecode.id) // test
print(dataDecode.nickname) // test
UserModel 타입을 가지는 변수 dataDecode는 Data(=> JSON) 형식으로 Encoding된 dataEncode 변수를 UserModel 형식으로 Decoding한 값을 저장합니다.
JSONDecoder().decode()의 첫 번째 파라미터에는 Decodable한 값이 들어가야하므로 Decodable한 성격도 가진 Codable을 채택한 UserModel이 들어올 수 있게 됩니다.
이렇게 JSON Data 형식을 구조체(UserModel)에 담아서 값을 꺼내어 쓸 수 있게 Decode 했습니다.
결론
- Encodable : 객체를 Data 형식으로 변환
- Decodable : Data 형식을 객체로 변환
Codable은 Encodable 프로토콜과 Decodable 프로토콜의 속성을 모두 갖는 타입으로 객체를 Data로, Data를 객체로 변환해야 할 때 채택하여 사용하는 프로토콜입니다!
'DEV - iOS > Background' 카테고리의 다른 글
[iOS Interview Questions] 앱 화면의 콘텐츠를 표시하는 로직과 관리를 담당하는 객체를 무엇이라고 하는가? (0) | 2023.05.09 |
---|---|
[iOS Interview Questions] Result 타입에 대해 설명하시오. (0) | 2023.03.31 |
[iOS Interview Questions] KVO 동작 방식에 대해 설명하시오. (1) | 2023.03.24 |
[iOS Interview Questions] Class의 성능을 향상 시킬수 있는 방법들을 나열해보시오. (0) | 2023.03.22 |
[iOS Interview Questions] Singleton 패턴을 활용하는 경우를 예를 들어 설명하시오. (0) | 2023.03.22 |