Codable을 이용한 데이터 저장
안녕하세요. 지난 포스팅에서는 사용자 정의 타입을 저장하고 불러오기 위해 저정하고 불러오기 전 NSCoding
과 NSKeyed(Un)Archiver
를 이용해 아카이빙/언아카이빙을 하는 방법을 알아보았습니다.
하지만 포스팅의 마지막에도 언급했듯이 모든 프로퍼티에 대해 인코딩과 디코딩을 설정해주어야 하기 때문에 프로퍼티가 많아지게 되면 상당히 번거로운 작업이 될 수 있다는 단점을 언급했습니다. 오늘은 이러한 번거로운 점을 보완하기 위해 Swift4에 새로 등장한 Codable
이란 프로토콜에 대해 간단히 알아보고 사용해보는 시간을 갖도록 하겠습니다.
Codable
Codable
은 Encodable
과 Decodable
로 이루어져 있습니다.
단어 뜻 그대로 Encodable
은 인코딩을 할 때 Decodable
은 디코딩을 할 때 사용합니다. 그리고 두 기능을 모두 사용하기 위해서는 Codable
을 사용합니다. Swfit4에서는 Built-in 타입들은 기본적으로 Codable
프로토콜을 따르고 있습니다. 그리고 Array
와 Dictionary
같은 타입도 기본적인 타입들로 구성되어 있다면 따로 프로토콜을 선언하지 않아도 기본적으로 인코딩과 디코딩이 가능합니다.
하지만 예제 어플리케이션에서 저장할 ToDO
클래스와 같이 사용자 정의 타입은 Codable
을 따르지 않기 떄문에 프로토콜을 선언해주어야 합니다.
- 프로퍼티들이 모두 기본적으로
Codable
을 준수하고 있기 때문에 직접 만든 Friend
클래스만 Codable
을 준수한다고 명시만 하면 됩니다.
모든 타입들에 대해 인코딩과 디코딩 작업을 직접 구현해저야 했던 NSCoding
에 비해 무척이나 간단해졌습니다.
Encode & Decode
그럼 이제 본격적으로 데이터를 저장하고 불러오도록 하겠습니다.
UserDefaults
를 사용해 PropertyList
즉 .plist
에 데이터를 저장하는 것입니다.
- 저장할 때 사용한 Key 값을 사용해 데이터를 불러오고 불러온 데이터는
Data
타입이기 때문에 캐스팅을 해줍니다. 그리고 원하는 타입으로 (여기서는 [ToDo]
) 디코딩을 진행합니다. 여기서 [ToDo]
가 아닌 [ToDo].self
를 하는 이유는 [ToDo]
타입의 변수를 넘기는 것이 아닌 타입 자체의 값, 즉 Metatype
을 넘기는 것이기 때문에 [ToDo].self
를 넘겨줍니다.
마무리
오늘은 이렇게 간단하게 사용자 정의 타입을 저장하기 위한 Codable
에 대해 알아보았습니다. 사실 Codable
은 JSON을 인코딩하고 디코딩하는데 더욱 많이 사용됩니다. 이렇게 Swift와 iOS에서 JSON을 다루는 방법에 대해서는 추후에 제가 공부를 한 후 관련 포스팅을 통해 찾아뵙도록 하겠습니다. 감사합니다.
참고자료
- Using Swift Codable With Property Lists
- Swift 4's Codable
- Codable in Swift 4.0
- Everything about Codable in Swift4