키 및 날짜 디코딩 전략
snake_case와 날짜 전략을 사용합니다.
키 및 날짜 디코딩 전략은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
디코딩 전략 개요
모든 타입마다 CodingKeys 열거형을 작성하는 대신 디코더에 전역 전략을 설정할 수 있습니다. 전략을 사용하면 디코딩되는 모든 타입에서 키를 변환하고 날짜를 일관된 방식으로 파싱할 수 있습니다.
import Foundation
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
print("Strategy configured")convertFromSnakeCase
keyDecodingStrategy = .convertFromSnakeCase를 설정하면 first_name 같은 키가 firstName이라는 camelCase 프로퍼티에 자동으로 매핑됩니다. 따라서 CodingKeys가 필요하지 않습니다.
import Foundation
struct User: Codable {
var firstName: String
var lastName: String
}
let json = "{\"first_name\":\"Ada\",\"last_name\":\"Lovelace\"}"
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let u = try decoder.decode(User.self, from: json.data(using: .utf8)!)
print(u.firstName, u.lastName)스네이크 케이스로 인코딩하기
인코더에는 반대 방향의 옵션도 있습니다. keyEncodingStrategy = .convertToSnakeCase를 사용하면 camelCase 프로퍼티를 snake_case JSON 키로 기록합니다.
import Foundation
struct User: Codable {
var firstName: String
}
let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
let data = try encoder.encode(User(firstName: "Ada"))
print(String(data: data, encoding: .utf8)!)모든 키에 적용되는 전략
키 전략은 모든 중첩 타입의 모든 프로퍼티에 일관되게 적용됩니다. 전체 API가 일관된 snake_case를 사용하는 경우에 특히 적합합니다.
import Foundation
struct Meta: Codable { var createdAt: String }
struct Doc: Codable { var docTitle: String; var docMeta: Meta }
let json = "{\"doc_title\":\"A\",\"doc_meta\":{\"created_at\":\"now\"}}"
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let d = try decoder.decode(Doc.self, from: json.data(using: .utf8)!)
print(d.docTitle, d.docMeta.createdAt)날짜 처리 문제
JSON에는 날짜 타입이 없습니다. Date 값은 숫자나 문자열로 인코딩되므로 디코더가 형식을 알아야 합니다. dateDecodingStrategy가 그 방법을 알려 줍니다.
import Foundation
struct Event: Codable {
var name: String
var date: Date
}
print("Date needs a strategy to parse")ISO-8601 날짜 디코딩
dateDecodingStrategy = .iso8601는 2020-01-01T00:00:00Z 같은 표준 ISO-8601 타임스탬프를 Date 값으로 파싱합니다.
import Foundation
struct Event: Codable {
var name: String
var date: Date
}
let json = "{\"name\":\"Launch\",\"date\":\"2020-01-01T00:00:00Z\"}"
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let e = try decoder.decode(Event.self, from: json.data(using: .utf8)!)
print(e.date.timeIntervalSince1970)ISO-8601 날짜 인코딩
인코더에서 이에 해당하는 설정은 dateEncodingStrategy = .iso8601이며, Date 값을 ISO-8601 문자열로 기록합니다.
import Foundation
struct Event: Codable {
var name: String
var date: Date
}
let e = Event(name: "Launch", date: Date(timeIntervalSince1970: 1577836800))
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .iso8601
let data = try encoder.encode(e)
print(String(data: data, encoding: .utf8)!)secondsSince1970 전략
API가 유닉스 타임스탬프를 숫자로 전송할 때는 .secondsSince1970을 사용해 이를 기준 시점 이후의 초로 해석합니다.
import Foundation
struct Event: Codable {
var date: Date
}
let json = "{\"date\":1577836800}"
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .secondsSince1970
let e = try decoder.decode(Event.self, from: json.data(using: .utf8)!)
print(e.date.timeIntervalSince1970)사용자 지정 날짜 형식
표준이 아닌 형식을 사용한다면 .formatted(_:)를 통해 DateFormatter를 전달합니다. 그러면 시간 구성 요소가 없는 2020-01-01 같은 날짜도 처리할 수 있습니다.
import Foundation
struct Event: Codable { var date: Date }
let fmt = DateFormatter()
fmt.dateFormat = "yyyy-MM-dd"
fmt.timeZone = TimeZone(identifier: "UTC")
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(fmt)
let e = try decoder.decode(Event.self, from: "{\"date\":\"2020-01-01\"}".data(using: .utf8)!)
print(e.date.timeIntervalSince1970)전략 함께 사용하기
같은 디코더에 키 전략과 날짜 전략을 함께 설정할 수 있으므로, 타입마다 반복해서 코드를 작성하지 않고도 snake_case와 ISO-8601을 사용하는 API를 처리할 수 있습니다.
import Foundation
struct LogEntry: Codable {
var eventName: String
var occurredAt: Date
}
let json = "{\"event_name\":\"login\",\"occurred_at\":\"2020-01-01T00:00:00Z\"}"
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
decoder.dateDecodingStrategy = .iso8601
let entry = try decoder.decode(LogEntry.self, from: json.data(using: .utf8)!)
print(entry.eventName, entry.occurredAt.timeIntervalSince1970)전략과 CodingKeys 비교
전역 전략은 규칙이 일관된 API에 간결한 방법입니다. 키가 몇 개만 다르거나 이름이 일정하지 않다면 명시적인 CodingKeys 열거형으로 키마다 정확하게 제어할 수 있습니다. 두 방법을 함께 사용할 수도 있습니다.
import Foundation
struct Item: Codable {
var itemName: String
}
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let i = try decoder.decode(Item.self, from: "{\"item_name\":\"Pen\"}".data(using: .utf8)!)
print(i.itemName)빠른 확인: 전략
디코딩 전략에 대한 이해도를 확인해 보세요.
복습: 키 및 날짜 전략
전역 코더 설정을 배웠습니다.
keyDecodingStrategy = .convertFromSnakeCase는 snake_case를 camelCase로 매핑하고,.convertToSnakeCase는 반대 방향으로 인코딩합니다.dateDecodingStrategy = .iso8601은 ISO 타임스탬프를 파싱하고,.secondsSince1970과.formatted(_:)는 다른 형식을 처리합니다.- 전략은 모든 중첩 타입에 일관되게 적용됩니다.
- 규칙이 일관된 API에는 전략을 사용하고, 일정하지 않은 API에는
CodingKeys를 사용합니다.
AI 튜터와 함께 Swift을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 122
- 레슨
- 409
자주 묻는 질문
“키 및 날짜 디코딩 전략” 강의는 무료인가요?
네 — “키 및 날짜 디코딩 전략” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“키 및 날짜 디코딩 전략”에서 뭘 배우나요?
snake_case와 날짜 전략을 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Swift Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“키 및 날짜 디코딩 전략” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.