[TIL/Swift] Swift Codable은 왜쓰는걸까?
Codable이란
Codable
은 Decodable과 Encodable 프로토콜을 모두 만족하는 type임을 알리는 typealias이다.
typealias Codable = Decodable & Encodable
Codable
을 타입이나 generic으로 활용한다면 손쉽게 데이터 모델을 JSON과 같은 외부 데이터 포맷으로 인코딩하고 디코딩할 수 있다.
외부 데이터와 상호작용할 수 있도록 도와주는 내장 type인 것 같다.
예시 코드
개념만 보니까 기본기가 부족해서인지 정확한 쓰임새를 알기가 힘들었다. 따라서 GPT를 통해 예시 코드를 받아 실행해보며 더 상세하게 쓰임새를 익혔다.
다음의 예시는 JSON 파싱에서 Codable
이 사용되는 시나리오를 보여준다. 첫번째 코드에서는 User
struct에 Codable
타입을 적용하였으며, 이를 통해 jsonData를 파싱하였다.
import Foundation
// JSON에서 사용하는 타입
struct User: Codable {
var id: Int
var name: String
}
// Type Alias 정의
typealias Users = [User]
// JSON 데이터 예시
let jsonData = """
[
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"}
]
""".data(using: .utf8)!
do {
// JSON 디코딩
let users: Users = try JSONDecoder().decode(Users.self, from: jsonData)
print(users)
} catch {
print("디코딩 오류: \(error)")
}
만약 Codable
없이 JSON 값을 파싱하려면 어떤 과정을 거쳐야할까? 다음은 수동으로 JSON 값을 파싱하는 코드 예시이다.
import Foundation
// Codable을 적용하지 않은 User 구조체 정의
struct User {
var id: Int
var name: String
var email: String?
}
// JSON 문자열 예시
let jsonString = """
{
"id": 1,
"name": "Alice",
"email": "alice@example.com"
}
"""
// JSON 문자열을 Data로 변환
if let jsonData = jsonString.data(using: .utf8) {
do {
// JSON 데이터 파싱
if let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] {
// 필드 값 추출
let id = jsonObject["id"] as? Int ?? 0
let name = jsonObject["name"] as? String ?? ""
let email = jsonObject["email"] as? String // 이메일은 옵셔널
// User 객체 생성
let user = User(id: id, name: name, email: email)
print(user) // User(id: 1, name: "Alice", email: Optional("alice@example.com"))
}
} catch {
print("파싱 오류: \(error)")
}
}
다음과 같이 Codable
을 사용하지 않는다면 json parsing과정이 수동적으로 이루어지며, 이전 코드에 비해 가독성도 떨어진다는 것을 확인할 수 있다. 또한 수동으로 처리하다보면 실수가 발생할 확률도 높아질 수 있기 때문에 다음과 같은 상황에서는 Codable
을 적극 활용하는 것이 좋다.
결론
아직 Swift 문법에 익숙하지 않아 프로토콜 개념도 서툰 상황이지만 JSON으로 전환이 필요한 DTO같은 데이터 모델을 생성할 때는 반드시 Codable을 타입으로 활용하는 것이 좋아보인다.
Subscribe to my newsletter
Read articles from pendant.k directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
pendant.k
pendant.k
iOS / Flutter Developer