๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IOS๐ŸŽ/iOS+Swift

[iOS] Codable - Encodable & Decodable ํ”„๋กœํ† ์ฝœ

by Jouureee 2021. 5. 31.

json์„ ํŒŒ์‹ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋‹ค์Œ ๊ธ€์—์„œ ์•Œ์•„๋ณด๊ฒ ๋‹ค. (๋งŽ๊ด€๋ถ€)

 

 

Codable ์ด๋ž€?

-> ์ž์‹ ์„ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ ํ‘œํ˜„(ex> json)์œผ๋กœ ๋ณ€ํ™˜ํ• ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…

๋ณดํ†ต์€ json์œผ๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค! ๊ทธ๋ž˜์„œ ์•„๋ž˜ ์˜ˆ์‹œ๋„ json ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค. 

 

Encodable๊ณผ Decodable์„ ํ†ตํ‹€์€ ๊ฒƒ

 

typealias๋Š” ๋ญ์ง€ ??

* typealias - ๊ธฐ์กด ์„ ์–ธ๋œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๋ณ„์นญ์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์„œ ์ฝ”๋“œ๋ฅผ ๋” ์ฝ๊ธฐ ์‰ฝ๋„๋ก ๋งŒ๋“œ๋Š” ๋ฌธ๋ฒ•

์˜ˆ๋ฅผ ๋“ค์–ด์„œ typealias Name: String ์ด๋ผ ํ–ˆ์„ ๋•Œ 

 

let name: Name = "ํ™๊ธธ๋™"   ==   let name: String = "ํ™๊ธธ๋™"

 

๊ธฐ์กด ํƒ€์ž… String์˜ ๋ณ„๋ช…์„ Name์œผ๋กœ ํ–ˆ์„๋•Œ ์•„ํ•˜ String ์ค‘์—์„œ ํŠน๋ณ„ํ•ด Name๋งŒ์œผ๋กœ ๋ฒ”์œ„๋ฅผ ์ขํžŒ ํƒ€์ž…์ด๊ตฌ๋‚˜ ํ•˜๊ณ  ์•Œ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

Codable์€ ํ”„๋กœํ† ์ฝœ์ด๋‹ค! ๋”ฐ๋ผ์„œ Codable์„ ์ด๋ฃจ๊ณ  ์žˆ๋Š” Encodable๊ณผ Decodable ์—ญ์‹œ ํ”„๋กœํ† ์ฝœ๋กœ 

enum, class, struct ์—์„œ ์ฑ„ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

codable์„ ์ฑ„ํƒํ•˜๊ฒŒ ๋˜๋ฉด ์™ธ๋ถ€ ํ‘œํ˜„์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์œผ๋กœ struct๋กœ ํ‘œํ˜„๋œ ๋ฐ์ดํ„ฐ๋ฅผ json๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ํ‘œํ˜„์œผ๋กœ ๋งŒ๋“ค์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด๋‹ค.

 

Encodable - ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ฐ”๊พธ์–ด์คŒ (f(x) ํ•จ์ˆ˜์™€ ๊ฐ™๋‹ค) 

 

->์ž๊ธฐ ์ž์‹ ์„ ์™ธ๋ถ€ ํ‘œํ˜„์œผ๋กœ encode ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…

 

 

Decodable - ๊ทธ ํ˜•ํƒœ๋ฅผ ํ•ด์„ํ•ด์คŒ(f-1(x) ์—ญํ•จ์ˆ˜์™€ ๊ฐ™๋‹ค)

์ž๊ธฐ ์ž์‹ ์„ ์™ธ๋ถ€ ํ‘œํ˜„์œผ๋กœ decode ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…

์ฐธ๊ณ ๋กœ Decodable์„ ์ฑ„ํƒํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” initํ•จ์ˆ˜๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค

 

 

๊ณต์‹ ๋ฌธ์„œ์— ๊ทธ๋ ‡๊ฒŒ ๋‚˜์™€์žˆ์Œ ใ…Žใ…Ž

 

 

์–ด๋–ป๊ฒŒ ํ•ด์ฃผ์–ด์•ผ ํ• ๊นŒ Codable ์ด ๋…€์„์˜ ์‚ฌ์šฉ๋ฒ•์ด ๊ถ๊ธˆํ•˜๋‹ค ..! 

encodable๋ถ€ํ„ฐ ์ฐจ๊ทผ ์ฐจ๊ทผ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž 

 

์˜ˆ๋ฅผ ๋“ค์–ด user struct๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด ์žˆ๋‹ค 

 

struct User {

var userName: String

var userEmail: String

}

 

1. ๋จผ์ € encoder ์„ ์–ธ

let encoder = JSONEncoder()) //์™ธ๋ถ€ ํ‘œํ˜„ ๊ทธ ์ค‘ json์œผ๋กœ encode ํ•ด์ฃผ๋Š” ๊ฐ์ฒด

 

2. struct๋ฅผ ์‹ค์ฒดํ™”ํ•œ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

let uri = User(userName: "Uri", userEmail: "spqjf12345@gmail.com")

 

3. encode ํ•˜๊ธฐ

let jsonData = try? encoder.encode(uri) //encode ํ•จ์ˆ˜๋Š” codable์„ ์ค€์ˆ˜ํ•˜๋Š” uri๋ฅผ encode

 

๊ทธ๋Ÿฌ๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ์ด๋ ‡๊ฒŒ json ํ˜•ํƒœ๋กœ ์ž˜ encoding ๋˜์—ˆ๋‹ค ใ…Žใ…Ž 

if let jsonData = jsonData, let jsonString = String(data: jsonData, encoding: .utf8) {
	print(jsonString)
} -> {"userName" : "uri", "userEmail" : "spqjf12345@gmail.com"} 

 

 

๋ฐ˜๋Œ€๋กœ decode๋Š” ?

 

what? {"userName" : "uri", "userEmail" : "spqjf12345@gmail.com"} ์„ decode ํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

 

 

1. ์šฐ์„  jsonDecoder ์„ ์–ธ

let decoder = JSONDecoder()

 

 

2. json์„ data๋กœ ๋งŒ๋“ค๊ธฐ

var data = jsonString.data(using: .utf8)

 

3. data๋ฅผ ์ธ์Šคํ„ด์Šคํ™”

 if let result = try? decoder.decode(User.self, from: data) {

            return result.userName //uri

 }

 

 

 

 


codingKey ๋ž€?

 

๋งŒ์•ฝ ์šฐ๋ฆฌ์˜ User ๋ฐ์ดํ„ฐ๊ฐ€

 

struct User: Codable {

var userName: String

var userEmail: String

}

 

jsonData ํ˜•ํƒœ

 

{

"user_name" : "uri",

"user_email": "spqjf12345@gmail.com"

}

์œผ๋กœ ๋˜์–ด์žˆ์„๋•Œ

์ด jsonData๋ฅผ User ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ decodeํ•˜๊ฒŒ ๋ ์‹œ

์—๋Ÿฌ๊ฐ€ ๋‚˜๊ฒŒ๋œ๋‹ค. ์™œ? key ๊ฐ’์˜ ์ด๋ฆ„์ด ๊ฐ™์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ

 

์ด๋ฅผ ์œ„ํ•ด codingKey๋ผ๋Š” protocol์ด ์กด์žฌํ•œ๋‹ค.

 

์ธ์ฝ”๋”ฉ ๋ฐ ๋””์ฝ”๋”ฉ์„ ์œ„ํ•œ ํ‚ค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…

 

enum์„ ์‚ฌ์šฉํ•ด codingKey ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ฒŒ ํ•˜๋Š”๊ฒƒ

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ์กด์— ์„ธ์› ๋˜ User struct๋Š”

 

struct User: Codable {
	var userName: String
	var userEmail: String
}

//codingKey ์ถ”๊ฐ€
struct User: Codable {
	var userName: String
	var userEmail: String

	enum CodingKeys: String, CodingKey {
	
	case userName = "user_name"
	case userEmail = "user_email"
	}
}

 

์ด๋ ‡๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค! 

 

ํ•˜๋‚˜ ํ•˜๋‚˜ ๋œฏ์–ด ํ•ด์„ํ•ด๋ณด๋‹ˆ ๊ธฐ์กด์— 

result["userName"] as? String ์ด๋Ÿฐ ์‹์œผ๋กœ key๊ฐ’๊ณผ value๊ฐ’์„ ๊ตฌ๋ถ„ํ•ด ๋‹ค์‹œ userData์— append ํ•ด์ฃผ๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์ธ๊ฑฐ ๊ฐ™๋‹ค ๋งŽ์ด ์• ์šฉํ•ด์•ผ์ง€ ใ…Žใ…Ž 

 

์ฐธ๊ณ  :

https://developer.apple.com/documentation/swift/codable/

https://zeddios.tistory.com/394

๋Œ“๊ธ€