์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Codable
- CRUD
- nodejs
- mongoose
- SWiFT
- Firestore CRUD
- ์ฑ๋ง๋ค๊ธฐ
- Cloud Firestore
- String.Index
- map
- ์ฑ๋์์ธ
- MongoDB
- Firestore
- ์๊ณ ๋ฆฌ์ฆ
- components
- Reduce
- Filter
- Encodable
- ์ง๋ฒ๋ณํ
- RxSwift
- ExpressJS
- UIRefreshController
- ios
- AVAudioPlayer
- Decodable
- DispatchQueue
- Core Data
- ํ๋ก๊ทธ๋๋จธ์ค
- Figma
- Mac
- Today
- Total
Focus On Develop ๐ค๐ค
[Swift] Codable ๋ณธ๋ฌธ
์ฐ๋ฆฌ๊ฐ ๋คํธ์ํต์ ๋ฑ์ ํตํ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ฃ !
์ด๋ค ์น์๋น์ค๋ฅผ ํธ์ถํด์ ๋ฐ์์๋ ์๊ณ , ์ด๋ค ์น์๋น์ค๋ฅผ ํตํด์ ์๋ฒ์ ์ ์กํ๊ธฐ๋ ํ์ฃ ,
๊ฐ์ฅ ๋ณดํธ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์๋ ์ฌ์ฉํ๋ ํฌ๋งท์ด ๋ฐ๋ก json ํฌ๋งท์ด์์!
{
"name": "Nury",
"age": 10,
"birthDate": "2021-02-26T12:15:17+0000"
}
์ด๋ ๊ฒ ์๊ธด ๋ ์๋ค ๋ง์ด ๋ณด์ จ์ฃ ~~?
jsonํฌ๋งท์ ์ด๋ ๊ฒ [key : value] ๋ก ๋ฌถ์ธ ๋ง์น Dictionary ํํ์ ํฌ๋งท์ด์์ ใ ใ
Swift์์๋ Codable์ด๋ผ๋ ๋ ์์ ํตํด json์ ์ฑ์ Object๋ก, ์ฑ์ Object๋ฅผ json์ผ๋ก ์ฝ๊ฒ ๋ง๋ค ์ ์์ด์!
๊ทธ๋ผ~~ Codable์ด๋ผ๋๊ฒ ๋ญ๋๋ฉด~~~
์์ ์ ๋ณํํ๊ฑฐ๋ ์ธ๋ถํํ(json๊ฐ์)์ผ๋ก ๋ณํํ ์ ์๋ ํ์ ์ด๋ผ๊ณ ํฉ๋๋ค!
๊ทผ๋ฐ Decodable & Encodable ์ด๋ผ๋ ํ์ ์ Codable ํ์ ์ผ๋ก ์ ์ํด๋จ๋ค์!
๊ทธ๋ผ Decodable, Encodable์ ๋ญ๊ฐ์~?
์ ์๋ฅผ ๋ณด๋ ์ด๊ฑด ๋๋ค ์ด๋ค ํ๋กํ ์ฝ์ด๋ค์!
๊ทธ๋ฌ๋ฉด, "Codable์ Decodable๊ณผ Encodeble ํ๋กํ ์ฝ์ ์ค์ํ๋ ํ์ (ํ๋กํ ์ฝ)์ด๋ค." ๋ผ๊ณ ํ ์ ์๊ฒ ๋ค์!
์~~ ์ข์. ๊ทผ๋ฐ Decodable๊ณผ Encodeble์ ๋ญํ๋ ์ ๋ค์ด์ผ? ๐
Decodable : ์์ ์ ์ธ๋ถํํ(json๋ฑ)์์ ๋์ฝ๋ฉ ํ ์ ์๋ ํ์
Eecodable : ์์ ์ ์ธ๋ถํํ(json๋ฑ)์ผ๋ก ์ธ์ฝ๋ฉ ํ ์ ์๋ ํ์
๊ทธ๋ผ.. ๋์ฝ๋ฉ, ์ธ์ฝ๋ฉ์ ๋ญ๋,
๋์ฝ๋ฉ : json๊ฐ์ ์ธ๋ถ ํฌ๋งท์ ์ฑ์์ ์ฌ์ฉํ ์ ์๋๋ก Object๋ก ๋ณํํ๋ ๊ฒ!
์ธ์ฝ๋ฉ : ์ฑ์ Object ํ์ ์ json๊ฐ์ ์ธ๋ถ ํฌ๋งท์ผ๋ก ๋ณํํ๋ ๊ฒ!
๋์ ์์ ๋ฐ๋์ ๊ฐ๋ ์ด์ฃ ~~? ์ฌ์ฉํ๋๊ฒ๋ ์์ ํ ๋ฐ๋์์! ๊ทธ๋ผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์ดํด๋ณผ๊ฒ์.
Decodable
let jsonString = """
{
"name": "Nury",
"age": 10,
"birthDate": "2021-02-26T12:15:17+0000"
}
"""
์์์ ๋ดค๋ ์ด๋ฐ ๋ ์์ ์ฑ์์ ์ฌ์ฉํ๋๋ก ๋์ฝ๋ฉ ํด๋ณผ๊ฑฐ์์!
struct Person: Codable {
var name: String
var age: Int
var birthDate: Date
}
๋จผ์ ๋ณํํ ํ์ ์ ์ ์ํด์ค๋๋ค! ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ Codable ํ๋กํ ์ฝ์ ์ฑํํ๋ค๋ ๊ฑฐ์์!
๊ทธ๋ฆฌ๊ณ , ๋์น์ฑ์ จ๊ฒ ์ง๋ง jsonํ์ผ์ key๊ฐ๊ณผ, Object์ ํ๋กํผํฐ๋ช ์ ์ด๋ ๊ฒ ๋ง์ถฐ์ค์ผ ์~ ์๊ฐ ์๊ตฌ๋~~ ํ๊ณ ๋ณํ์ด ๋์.
๋ง์ฝ ํค๊ฐ์ด ๋ฌ๋ผ์ผ ํ๋ ์ํฉ์ด๋ฉด, CodingKey๋ผ๋ ๋ ์์ ์ฌ์ฉํด์ฃผ๋ฉด ๋ฉ๋๋ค!!
๊ทธ๋ผ ๋จผ์ ๋ณํ ๋จ๊ณ๋ฅผ ์ดํด๋ณด๊ณ , ํ๋์ฉ ์์ธํ๊ฒ ์์๋ณผ๊ฒ์!
- JSONDecoder ์ ์ธ
- String ํ์
์ json์ Dataํ์
์ผ๋ก ๋ง๋ค๊ธฐ.
(์์์์๋ ์ง์ง .json ํ์ผ์ด ์๋๋ผ String์ผ๋ก ์์๋ก ๋ง๋ค์๊ธฐ ๋๋ฌธ์ ๋ณํํ๋๊ฑฐ์์! ์ง์ง json์ dataํ์ ์ ๋๋ค.) - Dataํ์ ์ JSONDecoder๋ฅผ ํตํด Object๋ก ๋ง๋ค๊ธฐ
1. JSONDecoder ์ ์ธ
let decoder = JSONDecoder()
2. String ํ์ ์ json์ Dataํ์ ์ผ๋ก ๋ง๋ค๊ธฐ.
let jsonData = jsonString.data(using: .utf8)
string.data() ๋ฉ์๋์ ๋ฆฌํด์ Data? ํ์ ์ด์์! ์ต์ ๋ ๋ฐ์ธ๋ฉ์ ํด์ค์๋ค.
3. Dataํ์ ์ JSONDecoder๋ฅผ ํตํด Object๋ก ๋ง๋ค๊ธฐ
if let jsonData = jsonString.data(using: .utf8) {
let person = try decoder.decode(Person.self, from: jsonData)
}
์ฐ๋ฆฌ๋ JSONDecoder๊ฐ ๊ฐ์ง decode() ๋ฉ์๋๋ฅผ ํตํด์ ๋์ฝ๋ฉ์ ํ ์ ์์ด์!
๊ทธ๋ผ decode() ๋ฉ์๋์ ์ ์๋ฅผ ์ดํด๋ณผ๊น์~?
๋จผ์ type์ ์ฐ๋ฆฌ๊ฐ ๋์ฝ๋ฉ ํ์ ์ด type์ผ๋ก ๋ง๋ค๊ฑฐ์ผ. ์ฆ "Decode ํ ๊ฐ์ ํ์ "์ด๋ผ๋ ๊ฑฐ์์,
์ด๊ฒ T.Type์ด๋ผ๊ณ ๋์ด์์ฃ ? ๊ทธ๋ฆฌ๊ณ ์ค๋ฅธ์ชฝ์ ๋ณด์๋ฉด T where T : Decodable ์ด๋ฐ๊ฒ ์๋ค์!
์ฆ ์ด๋ง์, type์ ์ด๋ค ํ์ (T.Type)์ธ๋ฐ, Decodable์ ์ค์ํด์ผ๋ง ๋ผ! ๋ผ๊ณ ์ ์๊ฐ ๋์ด์๋ค์!
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ Person ํ์ ์ผ๋ก ๋์ฝ๋ฉ์ ํด์ค๊ฑฐ๊ณ , Person์ Codable(Decodable์ ํฌํจํ๋) ํ๋กํ ์ฝ์ ์ค์ํ์ฃ !?
๊ทธ๋ฌ๋๊น ์ฐ๋ฆฌ๋ Personํ์ ์ ์ type์๋ฆฌ์ ๋ฃ์ด์ค ์ ์๊ฒ ๋ค์! ๐
๊ทธ๋ฆฌ๊ณ data๋ ๋์ฝ๋ฉํ ์์ค๋ฐ์ดํฐ๋ฅผ ๋งํ๋๊ฑฐ์์! ์ด data๋ฅผ ์ type์ผ๋ก ๋ณ๊ฒฝํด์ค! ํ๋๊ฑฐ์ฃ .
let person = try decoder.decode(Person.self, from: jsonData)
์, ๊ทธ๋ฌ๋ฉด ์ด์ ์ด ์ฝ๋๊ฐ ์ดํด๊ฐ ๋์๋์?ใ ใ ๐
๋์ฝ๋ฉ๋ ํ์ผ๋ ์๋ก๋ง๋ person๋ ์์ ์ข ์ถ๋ ฅํด๋ณผ๊น์?
if let jsonData = jsonString.data(using: .utf8) {
let person = try decoder.decode(Person.self, from: jsonData)
print("name : \(person.name)")
print("age : \(person.age)")
print("birth : \(person.birthDate)")
}
ํ.. ๋ญ๊ฐ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค!!
"Doubleํ์ ์ ๋์ฝ๋ฉ์ ์์ํ์ง๋ง, String, Dataํ์ ์ ์ฐพ์์ต๋๋ค" ๋ผ๊ณ ํ๋ค์!
์ด๊ฑด ๋ฐ๋ก birthDate๊ฐ Date ํ์ ์ผ๋ก ์ ์๋์๊ธฐ ๋๋ฌธ์ธ๋ฐ์!
์๋ฌด๋ฆฌ Codable์ด ๋งค์ฐ๋งค์ฐ ๊ฐ๋ ฅํ๋ค๊ณ ๋ ํ์ง๋ง,,, ์ด๋ ๊ฒ ๋ ์งํฌ๋งท์ String์ Date๋ก ๋ณํํ๊ธฐ ์ํด์๋,
decoder.dateDecodingStrategy = .iso8601
์ด๋ ๊ฒ ๋์ฝ๋์๊ฒ ๋ ์ง ํฌ๋งท์ ์ด๋ป๊ฒ ํ ๊ฑฐ์ผ? ํ๊ณ ์ ๋ต์ ์ง์ ํด์ค์ผ ํ ํ์๊ฐ ์์ด์!
๊ทธ๋ฆฌ๊ณ ๋ค์ ์คํ์ ํด๋ณด๋ฉด....
์ง ~~~ ์ ์ถ๋ ฅ ๋์๋ค์!!
json์ ๊ฐ์ ธ์์ ์ฑ์์ ์ฌ์ฉํ๋ Object๋ก JSONDecoder๋ฅผ ํตํด์ ๋์ฝ๋ฉํ๋ ๊ณผ์ ์ ์ดํด ๋ณด์์ต๋๋ค ๐๐
Encodable
์ด์ ๋ Encodable์ ๋ํด ์์๋ณผ๊ฑด๋ฐ์! Encoding์ Decoding๊ณผ ์์ ์ ๋ฐ๋ ๊ฐ๋ ์ด์๊ณ , ๊ตฌํ๋ ์ ๋ฐ๋๋ผ๊ณ ํ์ฃ !?
- JSONEncoder ์ ์ธ
- Object ํ์ ์ JSONEncoder๋ฅผ ํตํด Dataํ์ (json)์ผ๋ก ๋ง๋ค๊ธฐ
- Dataํ์
์ Stringํ์
์ผ๋ก ๋ง๋ค๊ธฐ
(์์์์๋ Stringํ์ ์ผ๋ก ์ถ๋ ฅํด๋ณด๋ ค๊ณ ํ๋๊ฑฐ์์! ์ค์ ๋ก API์ Body์ ํธ์ถํ ๋๋ Dataํ์ ๊ทธ๋๋ก ํธ์ถํฉ๋๋ค)
1. JSONEncoder ์ ์ธ
let encoder = JSONEncoder()
2. Object ํ์ ์ JSONEncoder๋ฅผ ํตํด Dataํ์ (json)์ผ๋ก ๋ง๋ค๊ธฐ
let data = try encoder.encode(person)
์ด๋ฒ์๋ JSONEncoder์ encode() ๋ฉ์๋๋ก Dataํ์ ์ผ๋ก ๋ง๋ค์ด ์คฌ๋ค์!
๊ทธ๋ผ encode() ๋ฉ์๋์ ์ ์๋ฅผ ์ดํด๋ณผ๊น์~?
Encodable ํ๋กํ ์ฝ์ ์ค์ํ๋ T๋ผ๋ ์ด๋ค ๋ฐ์ดํฐํ์ ์ Dataํ์ ์ผ๋ก ๋ฆฌํดํด์ฃผ๋ ๋ฉ์๋๋ค์~!
์ฐ๋ฆฌ๋ ์์์ person Object๋ฅผ ๋ง๋ค์๊ณ , ์ด person์ Personํ์ ์ด์์ฃ !? ๊ทธ๋ฆฌ๊ณ Person์ Codableํ๋กํ ์ฝ์ ์ค์ํ๋๊น ๋น์ฐํ Encodable๋ ์ค์ํ๊ณ ์๊ฒ ์ฃ ! ๊ทธ๋ผ ์ฐ๋ฆฌ๋ ์ด person์ value๋ก ๋ฃ์ด์ค ์ ์๊ฒ ๋ค์!
์ค์ ๋ก ์น์๋น์ค๋ฅผ ํตํด json ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ผ ํ ๋๋ ์ผ๋ฐ์ ์ผ๋ก Post๋ฐฉ์์ ํตํ APIํธ์ถ๋ก ์ด๋ฃจ์ด์ ธ์.
๊ทธ๋ body์ ์ด Dataํ์ ์ json์ ๊ทธ๋๋ก ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค!
์ฐ๋ฆฌ๋ ์ค์ต์ด๋๊น, ์ด Dataํ์ ์ Stringํ์ ์ผ๋ก ๋ณํํด์ ํ๋ฒ ์ถ๋ ฅํด๋ณผ๊ฒ์!
3. Dataํ์ ์ Stringํ์ ์ผ๋ก ๋ง๋ค์ด์ ์ถ๋ ฅํด๋ณด๊ธฐ
if let jsonString = String(data: data, encoding: .utf8) {
print(jsonString)
}
์ค~~ ์ฐ๋ฆฌ๊ฐ ์ํ๋ json ํฌ๋งท์ผ๋ก ๋ณํ์ด ๋๋ค์!! ๊ทผ๋ฐ.. ์ birthDate์ 6360์ด์ฉ๊ตฌ ์ ์ฉ๊ตฌ๋ ๋ญ์ฃ ..!?
์ด๊ฑด decoder์ date ํฌ๋งท ์ ๋ต์ ์คฌ๋ ๊ฒ๊ณผ ๋๊ฐ์์!
encoder.dateEncodingStrategy = .iso8601
์คํธ~~ ์ ๋์ค๋ค์!! ๐
ํ๊ฐ์ง, decoder๋ encoder์ dateํฌ๋งท ์ ๋ต์ ์ค๋ iso8601์ด๋ผ๋ ํ์ค ๊ท๊ฒฉ๋ง ์ฃผ๊ณ ์์ฃ ~?
์ด๊ฑฐ ์ธ์๋ Custom DataFormatter๋ฅผ ์ฌ์ฉํด์ ์ํ๋ ํฌ๋งท์ผ๋ก๋ ๋ณํ์ด ๊ฐ๋ฅํ๋ต๋๋ค ๐
์.... ๊ทผ๋ฐ.. ์์ง๋ ์ฝ~๊ฐ ์์ฝ์ฃ !? ์ฐ๋ฆฌ๋ ์ต์ํ ๋ณด๋ ์ด์ ํฌ๋งท์ผ๋ก ๋ง๋ค์ด์ฃผ๊ณ ์ถ์๋ฐ์ ๐
encoder.outputFormatting = .prettyPrinted
encoder์ ๋ ์งํฌ๋งท์ ๋ํ ์ ๋ต์ ์คฌ๋ ๊ฒ์ฒ๋ผ, ์ถ๋ ฅ ํฌ๋งทํ ์ ์ ํด์ค ์ ์์ด์!
์ด๋ ๊ฒ ์ถ๋ ฅ ํฌ๋งท์ .prettyPrinted๋ก ์ ํด์ฃผ๊ณ ๋ค์ ์ถ๋ ฅ์ ํด๋ณด๋ฉด!
์~~ ์ฐ๋ฆฌ๊ฐ ์ํ๋ json ๋ฐ์ดํฐ๋ก ๋ค์ ๋ณํ์ด ๋์๋ค์!!! ๐ค๐ค
์ค๋์ ๊ฐ๋จํ ์์ ๋ฅผ ํตํด์ Codable์ ๋ํด์ ์์๋ณด๊ณ , ์ค์ ๋ก Decoding, Encodingํ๋ ๋ฐฉ๋ฒ์ ์ค์ตํด๋ณด์์ด์!!
์ค๋๋ ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋์๊ธธ ๋ฐ๋์ ๐
'iOS [Swift] > ๊ธฐ์ด๋ฅผ ํํํ!' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] CaseIterable (0) | 2021.02.27 |
---|---|
[Swift] typealias (0) | 2021.02.26 |
[Swift] CodingKey (0) | 2021.02.26 |
[Swift] Cloud Firestore(2) ์ค์ตํด๋ณด๊ธฐ (0) | 2021.02.10 |
[Swift] Cloud Firestore(1) ๋ฐ์ดํฐ ๊ตฌ์กฐ (1) | 2021.02.08 |